Published on

December 27, 2017

Улучшение производительности SQL Server путем избегания функций в операторах WHERE

Когда речь идет об оптимизации производительности запросов SQL Server, одним из важных факторов, которые следует учитывать, является использование функций в операторах WHERE. Хотя функции могут быть полезными для манипулирования данными, они могут негативно сказаться на производительности запросов.

Давайте рассмотрим пример, чтобы лучше понять это. Предположим, у нас есть таблица “People” в нашей базе данных, и мы хотим получить записи, где столбец FullName равен ‘Stella Rosenhain’.

Если мы напишем простой запрос без использования функций:

SELECT PersonID, FullName
FROM [Application].[People]
WHERE FullName = 'Stella Rosenhain'

В этом случае SQL Server может использовать операцию поиска по индексу для быстрого нахождения нужных записей. Это происходит потому, что условие WHERE напрямую соответствует индексированному столбцу.

Однако, если мы используем функцию TRIM для столбца в операторе WHERE:

SELECT PersonID, FullName
FROM [Application].[People]
WHERE TRIM(FullName) = 'Stella Rosenhain'

Мы можем видеть из плана выполнения, что SQL Server должен выполнить сканирование индекса вместо поиска по индексу. Это происходит потому, что функция TRIM должна быть применена ко всему столбцу, прежде чем условие WHERE может быть оценено. Сканирование всего столбца может быть дорогостоящей операцией и существенно сказываться на производительности запроса.

Стоит отметить, что функция TRIM не лучше старомодного обходного пути, который заключается в использовании функций LTRIM и RTRIM отдельно:

SELECT PersonID, FullName
FROM [Application].[People]
WHERE LTRIM(RTRIM(FullName)) = 'Stella Rosenhain'

Как мы видим, использование функций LTRIM и RTRIM отдельно также приводит к сканированию индекса.

Итак, что мы можем сделать, чтобы улучшить производительность наших запросов? Ключевым моментом является избегание использования функций в операторах WHERE, когда это возможно. Вместо этого рассмотрите предварительную обработку данных или использование других техник, чтобы убедиться, что данные находятся в нужном формате перед выполнением запроса.

В заключение, хотя функции могут быть полезными для манипулирования данными в SQL Server, они могут негативно сказаться на производительности запросов, когда используются в операторах WHERE. Избегая использования функций в операторах WHERE и оптимизируя данные заранее, мы можем значительно улучшить производительность наших запросов SQL Server.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.