Странная проблема производительности полнотекстового поиска для простого упорядоченного запроса на большой таблице - PullRequest
0 голосов
/ 05 марта 2011

Моя таблица содержит около 7M записей, и ее структура выглядит следующим образом:

create table Locations (LocationID (PK, int, not null),LocationName varchar(100) NOT NULL  /*e.g. 'Paris'*/, ItemsNo (int, null), ICode char(1) null /*e.g. 'C'*/, LocationExtended nvarchar(max) null)

HTML-версия здесь: "создать таблицу Locations (LocationID (PK, int, not null), LocationName varchar (100) NOT NULL, ItemsNo (int, null), ICode char (1) null, LocationExtended nvarchar (max) null) "

Мой запрос действительно прост:

select top 20 LocationName, ItemsNo from Locations where contains(LocationExtended,@SearchTerms) and Icode='C' and ItemsNo is not null order by ItemsNO desc

HTML версия здесь: "выберите топ-20 LocationName, ItemsNo из Locations, где содержится (LocationExtended, @ SearchTerms) и Icode = 'C', а ItemsNo не является нулевым порядком по ItemsNO desc"

Конечно, существует полнотекстовый каталог для поля LocationExtended.

Теперь давайте немного поиграем с параметром @SearchTerms и с индексами:

Если у меня есть только кластерный индекс вСтолбец LocationID Я получаю время выполнения FAST для @ SearchTerms = 'Paris и France' (поскольку в поле LocationExtended очень мало записей, содержащих ключевые слова Paris и France) и время выполнения SLOW для @ SearchTerms = 'Франция (потому что в поле LocationExtended есть тысячи записей для каждого города во Франции).

Другими словами, результаты выглядят примерно так: for @ SearchTerms = 'Paris and France' возвращает: "Paris"and" Paris Paris "и" South Paris "для @ SearchTerms =" France "возвращает" Paris "," Nice "," Marseille ", .... и т. д.

, потому что мне нужны обаСценарии быстрого запуска Я создал некластеризованный индекс в таблице Locations со столбцами Icode и ItemsNO и столбцом LocationID.

Создав этот новый индекс, я получил обратные результаты: супер быстрое время выполнения для @ SearchTerms = 'Франция ', но медленные времена для @ SearchTerms =' Париж и Франция '

Теперь я застрял в этой точке.

Я упоминаю, что я использую SQL Server 2008 на Windows 2003 Server

Любая идея была бы оценена.Большое спасибо.

Ответы [ 2 ]

1 голос
/ 05 марта 2011

Добавьте OPTION (RECOMPILE) к запросу SELECT, чтобы оптимизатор «увидел» значение в переменной @SearchTerms и соответственно выбрал лучший план. Кроме того, рассмотрите возможность переписать запрос для использования CONTAINSTABLE - он часто более гибкий.

0 голосов
/ 06 марта 2011

Наконец, это сработало для меня:

Индексы: кластеризованный индекс по LocationID и некластеризованный индекс по ItemsNO с LocationID как включенные столбцы

Запрос: select TOP 20 * from ( select ROW_NUMBER() over (order by ItemsNO DESC) as RowID,ItemsNO,LocationName FROM Locations where contains(LocationExtended,@SearchTerms) and ItemsNO>0 and ICode='C') t

Это сократило время выполнения с 850 мс до ~ 45 мс

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