2015-01-22 4 views
0

У меня проблемы с полнотекстовым поиском SQL Server, работающим слишком медленно.SQL Server полностью текстовый поиск слишком медленный

Это занимает около минуты, чтобы запустить полнотекстовый поиск и JOIN запросов (смотри ниже)

select * from 

(SELECT 
    (row_number() over (order by b.BookKey)) as RowNumber, 
    p.PublishCity, 
    b.BookKey, 
    b.BookTitle 
from 
    Books b (nolock) 
    inner join PublishedRegions p (nolock) 
     on b.BookKey = p.BookKey 
where 
    contains(p.PublishCity, 'France') or 
    contains(b.BookTitle, 'France') 
) as t1 

where 
    RowNumber between 200 and 210 
  • Для справки, существует около 500к строк в книгах таблицы и PublishedRegions таблицы
  • Я не мог поместить PublisherCity в таблицу Books, потому что SQL Server позволяет вам определять только один полнотекстовый индекс для каждой таблицы.
  • Примечание: Последняя часть RowNumber между 200 и 210 была просто вставлена ​​произвольно. Я мог бы выбрать любой набор строк, и результаты все равно занимают много времени.
  • Таблица книг имеет полнотекстовый индекс в BookName NVARCHAR (255)
  • ОпубликованоРегионы имеют полный текстовый индекс в PublisherCity NVARCHAR (255).

Любые идеи, как улучшить производительность этого?

Спасибо!

+0

какая версия сервера Sql вы используете –

ответ

2

Если вы используете Sql Server 2012+, то для paging вместо Row_Number использовать OFFSET..FETCH. Что-то вроде этого.

SELECT 
    p.PublishCity, 
    b.BookKey, 
    b.BookTitle 
FROM 
    Books b (nolock) 
    INNER JOIN PublishedRegions p (nolock) 
     ON b.BookKey = p.BookKey 
WHERE 
    CONTAINS(p.PublishCity, 'France') OR 
    CONTAINS(b.BookTitle, 'France') 
ORDER BY b.BookKey OFFSET 199 ROWS FETCH NEXT 11 ROWS ONLY 

Offset-Fetch подход будет иметь более высокую производительность, чем Row_number. Check here для подробного сравнения

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