Как SQL Server будет выполнять этот запрос за кулисами - PullRequest
1 голос
/ 12 июля 2009
SELECT 
    *
FROM 
    myTable
WHERE 
    field1 LIKE 'match0' AND
    myfunc(t1.hardwareConfig) LIKE 'match1'

Вот мой вопрос,

сопоставление field1 выполняется быстро и быстро, но myfunc всегда возвращается, и я хочу убедиться, что, если field1 не совпадает, он даже не пытается выполнить myfunc.

Будет ли SQL знать об этом или я могу сделать это явно в своем запросе?

Я нахожусь на MSSQL 2000, 2005 и 2008, надеюсь, есть общий ответ.

Ответы [ 5 ]

7 голосов
/ 12 июля 2009

Для обеспечения порядка, в котором оцениваются условия, используйте следующий подход, поскольку задокументировано, что CASE сохраняет порядок, в котором оцениваются условия.

SELECT 
        *
FROM 
        myTable
WHERE 
  CASE WHEN field1 LIKE 'match0' THEN 
    CASE WHEN myfunc(t1.hardwareConfig) LIKE 'match1' 
      THEN 1 
    END 
  END = 1

Следующая статья объясняет это в деталях: Предикаты в SQL

1 голос
/ 12 июля 2009

mysp не может быть хранимой процедурой. Это должна быть пользовательская функция (кстати, вы должны были указать ее имя в схеме). Пользовательская функция не должна иметь побочных эффектов и должна придерживаться некоторых правил. По сути, SQL Server объединит запрос и выполнит его как один модуль с одним планом выполнения. Это не процедурный вызов функции, как вы могли ожидать. SQL описывает, что делать, а не как это делать, и оптимизатор запросов сгенерирует план, который отвечает на ваш полный запрос, а не на каждую его часть в отдельности. То же самое относится и к представлениям.

1 голос
/ 12 июля 2009

В SQL Server Management Studio (на 2008 год и, я думаю, на 2005 год), вы можете сказать ему, чтобы показать вам план выполнения. Нажмите Control-M в окне запроса. Затем выполните запрос. Это покажет вам детали.

1 голос
/ 12 июля 2009

За кулисами многое происходит, чтобы определить, как выполняется запрос, но в этой ситуации я бы ожидал , чтобы он сначала отфильтровал поле1 Обратите внимание, что это не гарантия - оптимизатор запросов может время от времени принимать странные решения. Кроме того, вы можете улучшить свои шансы, используя оператор «=», а не «LIKE».

0 голосов
/ 13 июля 2009

Это myfunc просто сложный расчет или часто возвращаемое значение изменяется. Мне интересно, потому что, если это не меняется так часто, и это часто выполняемый запрос, может быть лучше спроектировать, чтобы триггер после вставки вычислял значение и сохранял его в таблице как отдельный столбец. Тогда вам не нужно беспокоиться о том, в каком порядке оцениваются вещи. Запрос может выполняться даже быстрее, особенно если у вас есть индекс для обоих столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...