Розглянемо ці два твердження:
IF (CONDITION 1) OR (CONDITION 2)
...
IF (CONDITION 3) AND (CONDITION 4)
...
Якщо CONDITION 1
це так TRUE
, чи CONDITION 2
буде перевірено?
Якщо CONDITION 3
це так FALSE
, чи CONDITION 4
буде перевірено?
Що з умовами щодо WHERE
: чи оптимізує двигун SQL Server усі умови в WHERE
пункті? Чи повинні програмісти розміщувати умови в потрібному порядку, щоб бути впевненим, що оптимізатор SQL Server вирішує його правильно ?
ДОДАТО:
Дякую Джеку за посилання, сюрприз від коду 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
У цьому випадку виняток « Розділити на нуль» не збільшується.
ВИСНОВОК:
Якщо у C ++ / C # / VB є коротке замикання, чому його не може мати SQL Server?
Щоб справді відповісти на це, давайте подивимось, як обидва працюють з умовами. Усі C ++ / C # / VB мають коротке замикання, визначене в специфікаціях мови, щоб пришвидшити виконання коду. Навіщо турбуватися оцінювати умови N OR, коли перша вже є істиною або умовами M AND, коли перша вже помилкова.
Ми, як розробники, повинні усвідомлювати, що SQL Server працює інакше. Це система на основі витрат. Для отримання оптимального плану виконання нашого запиту процесор запитів повинен оцінити кожне, де умова, та призначити йому вартість. Потім ці витрати оцінюються в цілому, щоб створити поріг, який повинен бути нижчим, ніж визначений поріг, який має SQL Server для гарного плану. Якщо вартість нижча за визначений поріг, використовується план, якщо не весь процес повторюється знову з іншою сумішшю умовних витрат. Вартість тут - або сканування, або пошук, або об'єднання злиття, або хеш-з'єднання тощо. Через це коротке замикання, як це є в C ++ / C # / VB, просто неможливо. Ви можете подумати, що примусове використання індексу на стовпчику вважається коротким замиканням, але це не так. Це лише змушує використовувати цей індекс і тим самим скорочує перелік можливих планів виконання. Система все ще ґрунтується на витратах.
Як розробник, ви повинні знати, що SQL Server не робить короткого замикання, як це робиться в інших мовах програмування, і ви нічого не можете зробити для цього.