it-swarm.dev

Operatory logiczne OR ORAZ w stanie i porządku warunków w GDZIE

Przeanalizujmy te dwa stwierdzenia:

IF (CONDITION 1) OR (CONDITION 2)
...

IF (CONDITION 3) AND (CONDITION 4)
...

Gdyby CONDITION 1 to TRUE, będzie CONDITION 2 być sprawdzonym?
Gdyby CONDITION 3 to FALSE, będzie CONDITION 4 być sprawdzonym?

Co z warunkami na WHERE: czy silnik SQL Server optymalizuje wszystkie warunki w klauzuli WHERE? Czy programiści powinni umieszczać warunki w porządku , aby upewnić się, że optymalizator SQL Server rozwiąże je w prawo sposób?

DODANE:

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 Podziel 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 obaj 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ą warunków N OR, gdy pierwszy jest już prawdziwy lub M AND warunki, 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żna by 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.

35
garik

W SQL Server nie ma gwarancji, czy lub w jakiej kolejności instrukcje będą przetwarzane w klauzuli WHERE. Pojedyncze wyrażenie, które pozwala na zwarcie instrukcji, to CASE-WHEN. Poniżej znajduje się odpowiedź, którą opublikowałem na Stackoverflow:

W jaki sposób SQL Server zwiera GDZIE ocena stan

Dzieje się tak, kiedy ma się na to ochotę, ale nie w sposób, w jaki od razu myślisz.

Jako programista musisz zdawać sobie sprawę, że SQL Server nie powoduje zwierania , jak ma to miejsce w innych językach programowania i nic nie możesz zrobić, aby to wymusić .

Aby uzyskać więcej informacji, sprawdź pierwszy link w powyższym wpisie na blogu, który prowadzi do innego bloga:

Czy SQL Server zwarcie?

Ostateczny werdykt? No cóż, tak naprawdę jeszcze go nie mam, ale prawdopodobnie bezpiecznie jest powiedzieć, że jedynym czasem, w którym można zagwarantować określone zwarcie, jest wyrażanie wielu warunków KIEDY w wyrażeniu CASE . W przypadku standardowych wyrażeń boolowskich optymalizator przesunie wszystko według własnego uznania w oparciu o tabele, indeksy i dane, których dotyczy zapytanie.

27
MicSim

W języku T-SQL instrukcja IF może powodować zwarcie, ale nie można na nim polegać, oceniając wyrażenia w kolejności

SQL jest deklaratywnym językiem programowania. W przeciwieństwie do, powiedzmy, C++, który jest imperatywnym językiem programowania.

To znaczy. możesz to powiedzieć co chcesz w wyniku końcowym, ale nie możesz dyktować jak wynik jest wykonywany, wszystko zależy od silnika.

Jedynym prawdziwym sposobem zagwarantowania „zwarcia” (lub dowolnego innego przepływu sterowania ) wewnątrz WHERE jest użycie widoków indeksowanych, tymczasowych tabele i podobne mechanizmy.

PS. Możesz także użyć wskazówek dotyczących planu wykonania (aby „podpowiedzieć” silnikowi, jak wykonać zapytanie, które indeksy użyć i JAK ich używać), pomyślałem, że powinienem o tym wspomnieć, skoro jesteśmy na ten temat ...

0
jitbit