Przeanalizujmy te dwa stwierdzenia:
IF (CONDITION 1) OR (CONDITION 2)
...
IF (CONDITION 3) AND (CONDITION 4)
...
Jeśli CONDITION 1
tak TRUE
, zostanie CONDITION 2
sprawdzone?
Jeśli CONDITION 3
tak FALSE
, zostanie CONDITION 4
sprawdzone?
Co z warunkami na WHERE
: czy silnik SQL Server optymalizuje wszystkie warunki w WHERE
klauzuli? Czy programiści powinni umieszczać warunki we właściwej kolejności, aby mieć pewność, że optymalizator SQL Server rozwiąże je we właściwy sposób?
DODANY:
Dziękuję Jackowi za link, niespodzianka z kodu t-sql:
IF 1/0 = 1 OR 1 = 1
SELECT 'True' AS result
ELSE
SELECT 'False' AS result
IF 1/0 = 1 AND 1 = 0
SELECT 'True' AS result
ELSE
SELECT 'False' AS result
W tym przypadku nie występuje wyjątek dzielenia przez zero .
WNIOSEK:
Jeśli w C ++ / C # / VB występuje zwarcie, dlaczego SQL Server go nie ma?
Aby naprawdę na to odpowiedzieć, rzućmy okiem na to, jak oboje pracują w warunkach. Wszystkie C ++ / C # / VB mają zwarcie zdefiniowane w specyfikacjach języka, aby przyspieszyć wykonanie kodu. Po co zawracać sobie głowę oceną N warunków, gdy pierwszy jest już prawdziwy, lub M AND warunków, gdy pierwszy jest już fałszywy.
Jako programiści musimy pamiętać, że SQL Server działa inaczej. Jest to system oparty na kosztach. Aby uzyskać optymalny plan wykonania dla naszego zapytania, procesor zapytań musi ocenić każdy warunek i przypisać mu koszt. Koszty te są następnie oceniane jako całość, aby utworzyć próg, który musi być niższy niż zdefiniowany próg, który SQL Server ma dla dobrego planu. Jeśli koszt jest niższy niż zdefiniowany próg, stosowany jest plan, jeśli nie, cały proces powtarza się ponownie z inną kombinacją kosztów warunkowych. Koszt tutaj to albo skanowanie, albo wyszukiwanie, łączenie scalające, łączenie mieszające itp. Z tego powodu zwarcie, jak to jest dostępne w C ++ / C # / VB, po prostu nie jest możliwe. Możesz pomyśleć, że wymuszenie użycia indeksu na kolumnie liczy się jako zwarcie, ale tak nie jest. Wymusza to jedynie użycie tego indeksu, a tym samym skraca listę możliwych planów wykonania. System nadal opiera się na kosztach.
Jako programista musisz mieć świadomość, że SQL Server nie powoduje zwarć, jak ma to miejsce w innych językach programowania i nie możesz nic zrobić, aby zmusić go do tego.