Если поместить фиктивное условие в sql-запрос, например, между ‘mindate’ и ‘maxdate’, снизится ли эффективность запроса?

#sql #sql-server #sql-server-2008

#sql #sql-server #sql-server-2008

Вопрос:

В SQL Server 2008,

 select * from OneTable
  

сравните с

 select * from OneTable where OneTable.SomeDate between 'MINDATE' and 'MAXDATE'
  

какой из них быстрый или они такие же быстрые?

Ответ №1:

Эти запросы функционально эквивалентны, только если вы извлекаете всю таблицу целиком, и в этом случае предоставление дополнительного предложения, которое никоим образом не ограничивает извлекаемые данные, вряд ли будет быстрее. Это может быть медленнее (a) в силу того факта, что вы получаете доступ к данным через индекс. С опцией полного сканирования таблицы вам никогда не нужно прикасаться к индексу.

Безусловно, будет быстрее ограничить количество строк, извлекаемых на стороне сервера, чем получать все, а затем фильтровать на стороне клиента (при условии, конечно, что у вас есть индекс в вашем SomeDate столбце).

Но это только для случая, когда вы не извлекаете каждую строку.


(a) Или ваша СУБД может рано выяснить, что вы запросили все, и в любом случае выполнить полное сканирование таблицы, минимизируя воздействие.

Но, вероятно, это все еще будет немного медленнее только потому, что эту проверку необходимо выполнить заранее.

Комментарии:

1. Я знаю, что второй запрос не будет быстрее. Мне просто интересно, будет ли это медленнее. Я надеялся, что SQL server выполнит оптимизацию, чтобы удалить фиктивное условие, которое я добавил?

Ответ №2:

В этом простом случае это, вероятно, не имеет значения. Однако, когда у вас более ограничительное предложение where, это может привести к полному сканированию таблицы, даже если оно не требуется, и значительно снизить вашу производительность.

Комментарии:

1. О, нет .. это то, о чем я беспокоился. Я использовал ‘mindate’ и ‘maxdate’ в качестве значения по умолчанию для поиска в программе. Я надеюсь, что это не так уж плохо для производительности.

2. если вам нужен фиктивный параметр, чтобы у вас было допустимое предложение where, попробуйте a 1 = 1, это должно иметь меньше побочных эффектов.