2009-05-13 2 views
0

У меня есть следующее заявление:Вызов функции из внутри оператора выбора - SQL

SELECT CASE WHEN (1 = 1) THEN 10 ELSE dbo.at_Test_Function(5) END AS Result 

Я просто хочу, чтобы подтвердить, что в этом случае функция обыкновение быть выполнена?

Моя причина спрашивать, что эта функция особенно медленно, и если critiria верно, я хочу, чтобы избежать вызова функции ...

Приветствия Энтони

ответ

3

Не делайте это предположение, это WRONG. Оптимизатор запросов полностью свободен в выборе порядка оценки, который ему нравится, а SQL как язык НЕ предлагает короткое замыкание оператора. Даже если вы можете найти в тестировании, что функция никогда не оценивается, в процессе производства вы можете время от времени сталкиваться с условиями, которые заставляют сервер выбирать другой план выполнения и сначала оценивать функцию, а затем остальную часть выражения. Типичным примером будет тот факт, что сервер замечает, что функция возвращает детерминированную информацию и не зависит от данных строки, и в этом случае она сначала оценивает функцию для получения значения, а после, которая начнет сканирование таблицы и оценит ГДЕ критерии включения с использованием значения функции, определенного заранее.

+0

см. Эту статью Ицика Бен-Гана, показывающую, как эта ложная презумпция может привести к делению на нулевые ошибки: http://www.sqlmag.com/Articles/ArticleID/9148/pg /2/2.html –

+0

BTW, если возможно, попытайтесь создать функцию-обертку, которая выполняет проверку и вызывает исходную функцию. IF/THEN/ELSE гарантированно не выполняет ветку, которая не соответствует вашему состоянию. –

0

Предполагая, что вы делаете какие-то испытания ... Если вы пытаетесь избежать at_Test_Function, почему бы не просто закомментируйте его и сделать

SELECT 10 AS Result 
+0

Это упрощенный случай в реальной жизни, когда критерии были бы сложнее. –

0

Поместите WaitFor Delay '00:00:05' в функции. Если инструкция возвращается немедленно, она не выполняется, если требуется вернуть 5 секунд, после чего она была выполнена.

4

Ваше предположение верно - оно не будет выполнено. Я понимаю вашу озабоченность, но конструкция CASE «умна» таким образом - она ​​не оценивает никаких условий после первого действительного условия. Вот пример, чтобы доказать это. Если обе ветви этого сазе должны были выполнить, вы получите «деление на ноль» ошибка:

SELECT CASE 
       WHEN 1=1 THEN 1 
       WHEN 2=2 THEN 1/0 
      END AS ProofOfConcept 

ли это смысл?

+0

Прохладный, не думал об этом, приветствия –

Смежные вопросы