#sql #sql-server #tsql #database-performance
Вопрос:
Foo
Структура таблицы:
ID – PK
SampleCol – Can have null and is not indexed
SampleCol2, SampleCol3, etc
Таблица Foo
содержит более 100 000 строк со многими SampleCol
as NULL
.
SQL — запрос #1:
select *
from Foo
where SampleCol = 'Test'
SQL-запрос №2:
select *
from Foo
where SampleCol is not null and SampleCol = 'Test'
Имеет ли запрос № 2 какое-либо преимущество в производительности по сравнению с запросом № 1? Или какие-либо предложения о том, как повысить производительность этих SQL-запросов?
Спасибо!
Комментарии:
1. Это зависит от структуры вашей базы данных. Взгляните на план выполнения и убедитесь. И если вы ищете помощь в выполнении, вам нужно использовать «Вставить план», чтобы сделать план выполнения доступным для нас.
2. Нет, в запросе 2 нет повышения производительности. Проиндексируйте колонку!
3. @DaleK, я видел план выполнения и не нашел никакой разницы, следовательно, вопрос для любых советов экспертов. Кроме того, я предоставил образец ds, не зная, какая дополнительная информация о ds потребуется, поскольку это был скорее теоретический вопрос. Спасибо, что уделили мне время.
4. Спасибо @juergend, я нашел те же результаты, используя план выполнения, закрою вопрос, спасибо за ваше время.
5. Предикат
SampleCol = 'Test'
подразумевает НЕ НУЛЬ. Добавление другого предиката не помогает оптимизатору. Как упоминал Юрген, без индекса вы все равно получите полное сканирование таблицы (или сканирование кластеризованного индекса) для этого запроса.
Ответ №1:
Нет, это не поможет, хотя это может немного (вероятно, неизмеримо) ухудшить ситуацию.
Условие SampleCol = 'Test'
-это именно то сравнение, которое вы хотите сделать. Таким образом, база данных должна каким-то образом проводить это сравнение для каждой возвращаемой строки.
В принципе, есть две ситуации. Без индекса ваш запрос должен выполнить полное сканирование таблицы. Два сравнения в каждой строке (одно для NULL
значения и одно для значения) занимают больше времени, чем одно сравнение. Честно говоря, некоторые базы данных могут оптимизировать это только для сравнения равенства, чтобы они могли быть равными. Я не думаю, что SQL Server делает это, но это может быть.
С индексом SQL Server будет использовать индекс для =
сравнения. Затем он может провести дополнительное сравнение NULL
(даже если это излишне). Однако здесь вы сталкиваетесь с более серьезной проблемой: чем сложнее предикат, тем более вероятно, что оптимизатор запутается и не использует индекс.
Существует третий случай, когда ваш столбец используется для разбиения на разделы. Я не знаю, повлияет ли избыточное сравнение на сокращение разделов.
Вы хотите, чтобы ваши where
сравнения были простыми. В общем, вы хотите, чтобы оптимизатор выполнял свою работу. В очень редких случаях вы можете захотеть оказать оптимизатору некоторую помощь, но это очень, очень, очень редко-и обычно включает в себя функции, выполнение которых намного дороже, чем простое сравнение.