2010-11-02 5 views
1

Я использую asp.net с SQL Server 2008 SP2SQL Server 2008 Полнотекстовый поиск - SLOW

У меня есть одна таблица с полнотекстовым поиском.

Мое оборудование: 2GHZ Quad-Core, 4GB RAM, SAS HDD.

В таблице имеет около 5 миллионов записей, а его структура:

Pages table: 

ID (INT) 
GroupID (INT) 
GroupStart (bit) 
Col1 varchar(900) 
Col2 nvarchar(450) 
Col3 nvarchar(450) 
Col4 nvarchar(450) 
Col5 nvarchar(450) 

я есть FTS индекс первичного ключа ID.

Я использую следующий запрос для поиска в таблице:

SELECT * FROM ( 
SELECT * , ROW_NUMBER() OVER( ORDER BY KEY_TBL.Rank DESC ) AS RowNumber , COUNT(*) OVER() as TotalRows 
FROM Pages p 
INNER JOIN 
CONTAINSTABLE(Pages, *,N' FORMSOF (INFLECTIONAL, movies)') AS KEY_TBL 
ON p.ID = KEY_TBL.[KEY] 
WHERE (p.GroupID IS NULL OR p.GroupStart = 1) 
) LS 
WHERE RowNumber BETWEEN 0 AND 10 
ORDER BY RowNumber ASC; 

Запрос принимает 1s завершить, если общее число строк, составляет около 500.

и принимает 5s завершить, если всего строк - около 10000.

и принимает 60s, если полные ряды составляют около 100 000.

Любая идея, почему запрос занимает так много времени?

Есть ли что-то не так в моем запросе, sql-сервере или это проблема с оборудованием?

+0

Вы смотрели на план запроса? Какой самый большой хит? Другие мысли: что произойдет, если вы уберете «COUNT (*) OVER()»; также, сколько времени занимает только «CONTAINSTABLE» (с ROW_NUMBER) - мне интересно, стоит ли соединение дорого. Множество переменных - сложно дать полный ответ ... –

+0

thx для ответа. Я только что проверил это. удаление COUNT (*) OVER() отменяет запрос 60 секунд (из 100 000 результатов) на 3 с! – RuSh

+0

Так что же мне делать дальше? count (*) over() занимает большую часть времени, чтобы улучшить это? – RuSh

ответ

1

Полнотекстовый поиск полезен только для поиска текста в пределах varchar или текстовых полей, это не ускорит запросы. Для этого вам нужно добавить дополнительные индексы в таблицу.

В общем случае запрос кажется слишком сложным, но вы не объяснили, что должен делать запрос. Я думаю, что запрос нужно оптимизировать.

+0

Цель запроса - получить постраничные результаты из таблицы страниц, основанные на совпадениях FTS (col1-col5) с идентификатором GroupID IS NULL или GroupStart = 1. Какой индекс поможет скорости? – RuSh

+0

Если вы удалите предложение count, как быстро выполняется запрос? ... Если да, то как часто обновляется таблица? Если он не обновляется, часто учитывайте учет количества записей в отдельной таблице и обновляйте его с помощью триггера, когда таблица обновляется, или если у вас есть один источник обновлений, сработайте счет в SP при обновлении. –

+0

его количество результатов на основе полного текстового запроса, вы не можете подсчитать количество для каждого поискового запроса. – RuSh

1

Рассмотрим ограничение числа совпадений, возвращаемых CONTAINSTABLE ->CONTAINSTABLE(Pages, *,N' FORMSOF (INFLECTIONAL, movies)', 100)

+0

спасибо за ответ, НО это не действительно решение, мне нужно получить все результаты. – RuSh

+0

Хм, вот чего я боялся. По правде говоря, вы не получите разумной производительности от FT запросов более 5 миллионов строк. Вам нужно найти способ обойти. Не могли бы вы точно указать требование для этого запроса? То есть. было бы приемлемым игнорировать FORMSOF и, возможно, предоставлять какую-то другую логику поиска? –

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