Есть ли какое-либо преимущество в производительности, если мы исключим пустые строки в предложении where в запросе Select

#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 сравнения были простыми. В общем, вы хотите, чтобы оптимизатор выполнял свою работу. В очень редких случаях вы можете захотеть оказать оптимизатору некоторую помощь, но это очень, очень, очень редко-и обычно включает в себя функции, выполнение которых намного дороже, чем простое сравнение.