Производительность на реальном примере:
Таблица Адрес состоит из 320К строк данных. Нам нужен Adres.Id, когда у нас есть электронная почта (как в вашем примере).
Сортировка базы данных (и таблицы адресов): SQL_Latin1_General_CP1_CI_AS
Для оптимизации производительности для столбца Электронная почта был создан некластеризованный индекс (включен столбец Adres.Id)
Запросы выглядят так:
SELECT Adres.ID,Email FROM csc.Adres WHERE EMAIL ='23LMDLh6N@f8CyB7vPL.r4L'
SELECT Adres.ID,Email FROM csc.Adres WHERE EMAIL='23LMDLh6N@F8CyB7vPL.r4L' COLLATE Latin1_General_bin
1 строка была возвращена для каждого запроса
результаты: ![enter image description here](https://i.stack.imgur.com/qaWg5.jpg)
Похоже, что во втором случае запрос SQL Server не идентифицирует как SARG. Зачем? Давайте посмотрим на детали.
В первом случае:
ScalarOperator ScalarString="CONVERT_IMPLICIT(nvarchar(4000),[@1],0)
И в секунду:
ScalarOperator ScalarString="CONVERT_IMPLICIT(nvarchar(80),[CSCENTRUMTest].[csc].[Adres].[Email],0)=CONVERT_IMPLICIT(nvarchar(4000),CONVERT(varchar(8000),[@1],0),0)">
Таким образом, во втором случае электронная почта преобразуется в требуемое сопоставление. Этот случай не SARG, и было выполнено сканирование индекса.
Если запросы не могут быть идентифицированы как SARG (например, LIKE '%some email%)
', планы совпадают.
Предполагается, что если ваш запрос может быть идентифицирован как SARG, и у вас есть соответствующий индекс, предпочтительнее использовать отсутствие параметров сортировки (лучше проводить диалог сравнения на стороне клиента / службы).
Вы можете найти информацию о SARG в различных книгах / статьях по настройке производительности.