Czy istnieje sposób sprawdzenia równości matematycznej dwóch instrukcji SQL?
Mam dwie instrukcje SQL:
- SQL_STATEMENT_1
- SQL_STATEMENT_2
Uruchamianie obu instrukcji na danych i porównywanie danych wyjściowych wcale nie pomaga.
Zestaw matematyki za wyrażeniami musi zostać oceniony, podobnie jak solver równań.
Poza zakresem mojego pytania są takie rzeczy jak:
- porównania inne niż równość (większa niż, mniejsza niż LIKE, ...)
- procedury składowane lub wyzwalacze
- Typowe wyrażenia tabelowe (Z)
W zakresie:
- Wybiera: WHERE other_id IN (WYBIERZ id z innego GDZIE ...)
- ŁĄCZY
database-theory
guettli
źródło
źródło
select * from foo where id = 4
z pewnością będzie miał taki sam plan wykonania jakselect * from foo where id = 2
select * from foo where id = 4
iselect * from foo where id = 2
mieć dwóch różnych planów wykonania jeśli statystyki 1) indeks nie są up-to-date i 2) nawet jeśli statystyki indeksu są up-to-date, klucz podziału id jest koślawe (podany identyfikator nie jest unikalnym kluczem).Odpowiedzi:
Jaka jest matematyczna równość dwóch instrukcji SQL? Dla mnie dwa zapytania są równoważne, jeśli podane oba te same dane z dowolnego zestawu danych, zwracają ten sam zestaw wyników.
Jak wskazałeś, zapytania SQL, nadzbiór algebry relacyjnej , mogą być bardzo złożone. Możemy mieszać podkwerendy, korzystać z procedur przechowywanych i funkcji ( deterministycznych lub nie), dzięki czemu zapytanie wygląda bardziej jak prawdziwy kod . Jeśli mówisz o tego rodzaju zapytaniach, będzie to naprawdę trudne. W rzeczywistości prawdopodobnie nie różni się od problemu „są równoważne dwa algorytmy”.
W tych warunkach jest to prawdopodobnie niemożliwe.
Jednak...
... może być wykonalne, jeśli dwa zapytania, które chcesz porównać, to ściśle ustawione operacje. Jeśli tak, możesz przekonwertować zapytania na algebrę relacyjną, a następnie opracować je zgodnie z regułami równoważności . Jeśli masz wybór / ograniczenie z nietrywialnymi warunkami logicznymi, możesz skończyć z koniecznością udowodnienia, że warunki te są również równoważne. Musisz wtedy polegać na algebrze boolowskiej i prawdopodobnie skończysz robić tabelę prawdy .
Jak widać, będzie to dużo pracy i, o ile wiem, nie istnieje nic, aby to wszystko obliczyć automatycznie. Niemniej jednak znalazłem kilka narzędzi, które mogą okazać się przydatne, jeśli chcesz rozwiązać to zadanie:
źródło
Z definicji nie można sprawdzić równoważności semantycznej w skończonym czasie, patrz twierdzenie Rice'a :
źródło
użytkownik dba, Lennart, wskazał mi ten projekt:
http://cosette.cs.washington.edu/
źródło
Jednym ze sposobów jest zbudowanie parsera lub, lepiej, użycie istniejącego. Wierzę, że C # ma klasę TSQLParser i ma metodę Parse (). Analizator składni podzieli zapytanie na podklasy, które można następnie porównać.
źródło
Jeśli szukasz testu ekwiwalencji opartego na Teorii Setów, najlepszym rozwiązaniem jest konwersja dowolnych
WHERE
warunków, które można przekształcić w rodzajJOIN
(wewnętrzny lub zewnętrzny) i refaktoryzacja instrukcji. Obejmuje toIN subselect
iEXISTS subselect
wszelkie inne warunki wWHERE
klauzuli zawierającej to słowoSELECT
. Jeśli wykonasz to na obu instrukcjach SQL, otrzymasz nowąFROM
klauzulę, która reprezentuje logikę / matematykę opartą na zestawach, którymi jesteś zainteresowany. Następnie możesz po prostu wizualnie porównać obie instrukcje. Jeśli szukasz zautomatyzowanego sposobu robienia tego wszystkiego, nie znam narzędzia, które potrafi to dokładnie zrobić.źródło