SQL Server Где оговорки - PullRequest
       6

SQL Server Где оговорки

0 голосов
/ 26 октября 2009

При выполнении запроса выбора (в SQL SERVER 2000+) с несколькими операторами where, такими как

SELECT    * 
FROM      TABLE1
WHERE     TableId = @TableId 
          AND Column1 = @Column1 
          AND Column2 = @Column2 
          AND Column3 = @Column3 etc.

... вычисляет ли запрос каждое из предложений where, даже если первое не равно? У меня есть запрос, который проверяет каждый из столбцов, чтобы увидеть, были ли внесены какие-либо изменения, перед обновлением (то есть он обновляется только при наличии изменений). Если запрос сравнивает каждый столбец, то я думаю, что мне нужно будет переписать запрос. Однако, если механизм запросов сначала фильтрует столбец идентификатора, а затем сравнивает каждый столбец отдельно в пределах этого отфильтрованного набора, производительность должна быть хорошей (я бы подумал?).

Надеюсь, это имеет смысл.

Спасибо, Джеймс.

Ответы [ 4 ]

3 голосов
/ 26 октября 2009

Опираясь на статистику и доступные индексы, оптимизатор определит, какой из них является наилучшим для вычисления запроса. В большинстве случаев все получается правильно, но может быть отброшено устаревшей статистикой.

Вы не должны беспокоиться о порядке предложений WHERE. Вместо этого взгляните на фактический план выполнения, созданный для запроса.

2 голосов
/ 26 октября 2009

номер

Механизм запросов довольно хорошо оптимизирован.

0 голосов
/ 30 октября 2009

Я не знаю, будет ли это возможно в вашем случае, но попробуйте это:

В таблице / наборе данных, которые вы просматриваете, создайте столбец getdate () с датой LastModified datetime по умолчанию. Затем создайте триггер для обновления этой таблицы. Заставьте курок сделать следующее.

При обновлении set LastModified = getdate ()

Это хороший дизайн базы данных, и вы можете индексировать столбец LastModified. Это более узкий индекс, и ваш запрос теперь может быть

UPDATE... WHERE LastModifed >= @LastRunDate

Для получения справки по триггерам попробуйте этот поток переполнения стека: Запуск триггера

0 голосов
/ 26 октября 2009

почему дважды ударил данные чем-то вроде:

--did data change?
if exists (select ... where pk=@pk and and and...)
begin
    update ... where pk=@pk
end

просто сделайте что-то вроде:

update ... where pk=@pk and and and...

вы можете проверить @@ ROWCOUNT, если вам нужно знать, действительно ли оно изменилось и было ОБНОВЛЕНО

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