Преобразовать в запрос SARGable - PullRequest
0 голосов
/ 20 декабря 2018

Я хочу написать запрос для поиска содержащей строки в таблице.

Таблица:

Create table tbl_sarg
(
    colname varchar(100),
    coladdres varchar(500)
);

Примечание. Я просто хочу использовать Index Seek для поиска по 300 миллионамзаписей.

Индекс:

create nonclustered index ncidx_colname on tbl_sarg(colname);

Образцы записей:

insert into tbl_sarg values('John A Mak','HNo 102 Street Road Uk');
insert into tbl_sarg values('Shawn A Meben','Church road USA');
insert into tbl_sarg values('Lee Decose','ShopNo 22 K Mark UK');
insert into tbl_sarg values('James Don','A Mall, 90 feet road UAE');

Запрос 1:

select * from tbl_sarg
where colname like '%ee%'

Фактический план выполнения:

enter image description here

Запрос 2:

select * from tbl_sarg
where charindex('ee',colname)>0

Фактический план выполнения:

enter image description here

Запрос 3:

select * from tbl_sarg
where patindex('%ee%',colname)>0

Фактический план выполнения:

enter image description here

Как заставить обработчик запросов выполнить следующие действия:использовать поиск по индексу вместо сканирования таблицы / индекса по большому набору данных?

1 Ответ

0 голосов
/ 20 декабря 2018

Все отправленные вами запросы по определению не являются SARgable, например, использование «% ..%» автоматически заставляет Query Engine выполнять сканирование, другой случай - использование функций (какcharindex или patindex) внутри вашего столбца внутри предиката.

Вот какой-то пост: https://bertwagner.com/2017/08/22/how-to-search-and-destroy-non-sargable-queries-on-your-server/

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

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