Apakah ada cara untuk memeriksa kesetaraan matematis dari dua pernyataan SQL?
Saya punya dua pernyataan SQL:
- SQL_STATEMENT_1
- SQL_STATEMENT_2
Menjalankan kedua pernyataan pada data dan membandingkan output tidak membantu sama sekali.
Himpunan matematika di balik pernyataan perlu dievaluasi, seperti yang dilakukan oleh pemecah persamaan.
Di luar ruang lingkup pertanyaan saya adalah hal-hal seperti:
- perbandingan selain kesetaraan (lebih besar dari, kurang dari, SEPERTI, ...)
- prosedur tersimpan, atau pemicu
- Ekspresi Common Table (WITH)
Dalam lingkup:
- Subseleksi: WHERE other_id IN (PILIH id DARI WHERE lainnya ...)
- BERGABUNG
database-theory
guettli
sumber
sumber
select * from foo where id = 4
pasti akan memiliki rencana eksekusi yang sama denganselect * from foo where id = 2
select * from foo where id = 4
danselect * from foo where id = 2
memiliki dua rencana eksekusi yang berbeda jika 1) statistik indeks tidak mutakhir dan 2) bahkan jika statistik indeks mutakhir, distribusi utama id adalah miring. (ID yang disediakan bukan kunci unik).Jawaban:
Apa persamaan matematis dari dua pernyataan SQL? Bagi saya, dua pertanyaan setara jika, ketika diberi kedua dataset yang sama, keduanya mengembalikan hasil yang sama.
Seperti yang Anda tunjukkan, SQL queries, superset dari aljabar relasional , bisa sangat kompleks. Kami dapat mencampur subqueries, menggunakan prosedur dan fungsi yang tersimpan ( deterministik atau tidak) yang akan membuat Anda lebih mirip kode nyata . Jika Anda berbicara tentang pertanyaan seperti ini maka itu akan sangat sulit. Sebenarnya itu mungkin tidak berbeda dari masalah "adalah dua algoritma yang setara".
Dalam kondisi itu mungkin tidak mungkin.
Namun...
... mungkin layak jika dua pertanyaan yang ingin Anda bandingkan adalah operasi yang ketat. Jika demikian, Anda bisa mengonversi kueri ke aljabar relasional dan kemudian menyelesaikannya dengan mengikuti aturan kesetaraan . Jika Anda memiliki pilihan / batasan dengan kondisi boolean nontrivial maka Anda mungkin perlu membuktikan daripada kondisi mereka juga setara. Anda kemudian harus mengandalkan aljabar boolean dan Anda mungkin akan berakhir dengan melakukan tabel kebenaran .
Seperti yang Anda lihat ini akan menjadi banyak pekerjaan dan, sejauh yang saya tahu, tidak ada yang bisa menghitung semua itu secara otomatis. Meskipun demikian, saya menemukan beberapa alat yang menurut Anda berguna jika Anda ingin menangani tugas:
sumber
Tidak mungkin untuk memeriksa kesetaraan semantik dalam waktu yang terbatas menurut definisi, lihat teorema Rice :
sumber
pengguna dba Lennart menunjuk saya ke proyek ini:
http://cosette.cs.washington.edu/
sumber
Salah satu cara untuk melakukannya adalah dengan membangun parser, atau lebih baik, gunakan yang sudah ada. Saya percaya C # memiliki kelas TSQLParser dan memiliki metode Parse (). Parser akan memecah kueri Anda ke sub-kelas yang kemudian dapat Anda bandingkan.
sumber
Jika Anda mencari tes kesetaraan berbasis Teori Set, taruhan terbaik Anda adalah mengonversi
WHERE
kondisi apa pun yang dapat dikonversi menjadi jenisJOIN
(dalam atau luar) dan minta pernyataan itu di-refactored. Ini termasukIN subselect
danEXISTS subselect
dan semua ketentuan lain dalamWHERE
klausa yang berisi kataSELECT
. Jika Anda melakukan ini pada kedua pernyataan SQL, Anda akan memilikiFROM
klausa baru yang mewakili logika / matematika berbasis set yang Anda minati. Kemudian Anda bisa membandingkan dua pernyataan secara visual. Jika Anda mencari cara otomatis untuk melakukan semua ini, saya tidak tahu alat yang bisa melakukan ini.sumber