#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, это должно иметь меньше побочных эффектов.