SQL Сервер. почему функция UPPER использует сканирование индекса - PullRequest
0 голосов
/ 07 марта 2020

Запрос № 1

SELECT ID 
FROM Product 
WHERE Name ='Banana'

Запрос № 2

SELECT ID 
FROM Product 
WHERE UPPER(Name) = 'Banana'

Я изучаю планы выполнения по вышеуказанным запросам. Я понял, что первый запрос использует поиск по индексу, но почему второй запрос использует сканирование индекса? Это из-за функции UPPER?

1 Ответ

0 голосов
/ 07 марта 2020

Применение функции к столбцу обычно приводит к тому, что запрос становится «не SARGable», это означает, что индексы больше не могут использоваться (есть несколько исключений). Основная причина, по которой это происходит, заключается в том, что порядок данных уже не тот, что связано с использованием функции (обратите внимание, то, что функция не меняет порядок, не означает, что она будет SARGable). Поскольку порядок новых данных может не соответствовать порядку индекса, он не может быть использован

очевидная причина, по которой вы используете UPPER, заключается в том, что вы используете сортировку с учетом регистра , Теперь для некоторых сопоставлений порядок букв сортируется как A,a,B,b,C,c...Y,y,Z,z, а для других это A,B,C...Y,Z,a,b,c...,y,x, это означает, что в зависимости от сопоставления a может быть как больше, так и меньше B. Применение UPPER к этому значению будет означать, что значение всегда меньше чем B; таким образом, меняя порядок.

Таким образом, для баз данных сортировки с учетом регистра, наиболее распространенным методом является сохранение вычисляемого столбца PERSISTED со значением верхнего регистра:

ALTER TABLE dbo.YourTable ADD Name_UC AS UPPER([Name]) PERSISTED;

Затем, когда вы передавая значения (параметры), вы также убедитесь, что все они в верхнем регистре:

SELECT {columns}
FROM dbo.YourTable
WHERE Name_UC = UPPER(@YourParameter);

Конечно, для того, что у вас есть (WHERE UPPER(Name) = 'Banana') , если вы являетесь с использованием сортировки с учетом регистра, он никогда не вернет никаких результатов, поскольку 'anana' являются строчными буквами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...