2010-07-12 2 views
3
declare @name varchar(156) 
set @name ='sara' 
--Query 1: 
SELECT [PNAME] FROM [tbltest] where [PNAME] like '%'[email protected]+'%' 

--Query 2: 
SELECT [PNAME] FROM [tbltest] where [PNAME] like '%sara%' 

Предположим, что в столбце [PNAME] в [tbltest] имеется индекс NoneClustered. при запуске запросов, план выплат показать указатель Ищите запрос 1 и сканирование индексов для запроса 2. Я ожидал, что всплывающее окно всплывающего окна «Исключение Пальма». Для обоих запросов, но из-за использования параметра в первом запросе он показывает индексный поиск. Так что же я матер? в обоих запросах мы использовали '%' на той стороне, и знаем, что в этом состоянии sql не учитывает индекс , но почему в первом запросе индекса запроса указатель поиска? спасибоПлан выплат Sql показывает различный результат для тех же входов

ответ

0

Если вы используете DBCC SHOW_STATISTICS на своей таблице и используемом индексе, найдите первую строку строки в строке «String Index = YES». SQL Server поддерживает некоторую дополнительную статистику для удовлетворения запросов, таких как «% x»

В первом запросе вы, вероятно, увидите вычисленные значения скалярного значения - посмотрите в плане запроса для LikeRangeStart ('%' + @ name + '% «). Индексный указатель против этих значений в отличие от индекса сканирования против% sara%.

Как это работает, я не знаю. Почему SQL Server не был достаточно умен, чтобы преобразовать 'sara' в константу и выполнить запрос так же, как я тоже не знаю. Но я думаю, что это то, что происходит.

Против% sara% он выполняет сканирование индекса, считывая весь индекс. Против% + @ name +% он создает рассчитанные значения RangeStart/RangeEnd/RangeInfo и использует их для поиска индекса, как-то используя дополнительную статистику строк.

0

Я думаю, что Майк на правильном пути о том, нападаете ли вы на индекс или нет. Возможно, вам потребуется больше понимания того, как ваши данные распределяются внутри таблицы. Я видел случаи, когда попадание индекса является более дорогостоящим из-за необходимости чтения двух дисков. Чтобы понять, почему, вам нужно знать, как ваши данные распределяются по индексу, сколько записей будет вписываться в страницу и какова ваша схема кэширования.

Я скажу, что может быть сложно настроить запрос с помощью ведущего%. База данных должна будет полностью пересечь ваш индекс (или таблицу) и нанести удар по каждому узлу, который ищет значение, содержащее «сару». В зависимости от ваших потребностей вам может потребоваться полнотекстовый поиск (т. Е. Значение параметра в этом запросе используется, поскольку оно предоставляется в качестве ввода от пользователя вашего приложения).

1

В запросе используется параметр, запрос 2 константа.

План запроса 2 не будет использоваться повторно, если вы измените постоянное значение.

Запрос для плана 1 может быть. В этом случае SQL Server (просто) оставляет свои опции открытыми для повторного использования плана.

AKA: запросы не то же самое.

Если вы force parameterisation, то вы должны сделать оба запроса работать как запрос 1. Но я не пробовал ...

Смежные вопросы