Будет ли полнотекстовый поиск учитывать индексы?

Хорошо, у меня есть индекс полнотекстового поиска, созданный в моей таблице JobsToDo, но меня беспокоит то, что это делает другие мои индексы в таблице бесполезными. У меня есть обычный некластеризованный индекс для поля CreatedDate в этой таблице. Поэтому, когда я запускаю свой полнотекстовый поиск, он возвращает результаты, затем я фильтрую свой полнотекстовый поиск по CreatedDate >= GETDATE() - 7, чтобы получить значение JobsToDo за последние 7 дней. Теперь используется мой обычный индекс (в CreatedDate) или он игнорирует этот индекс и выполняет поиск исключительно по полнотекстовому индексу, а затем просто снова выполняет поиск критериев даты во всей таблице? Мой запрос выглядит так:

// First create an index
CONSTRAINT [IX_JobsToDo] UNIQUE NONCLUSTERED 
(
    [CreateDate]
)

// Now run query
SELECT                      JobId,
                            Title,
                            FROM JobsToDO
                            FREETEXTTABLE (JobsToDo, (Title, [Description]), 'somestring')
                                AND CreatedDate >= GETDATE() - 7;

Подводя итог, будет ли этот запрос использовать мой индекс, который я создал на CreatedDate, или нет?


person David    schedule 15.11.2009    source источник


Ответы (2)


Да, оптимизатор запросов рассмотрит возможность использования сочетания индексов FT и не-FT. См. этот технический документ Полнотекстовые запросы SQL Server 2005 к большим каталогам: извлеченные уроки.

Кстати, ваш некластеризованный индекс CreateDate по-прежнему подчиняется другим передовым методам использования индекса. В вашем случае, если количество записей за последние 7 дней достаточно велико, оптимизация запроса может упасть на Переломный момент для индекса, поскольку CreateDate не распространяется на Title (при условии, что JobId является частью ключа кластеризованного индекса, в противном случае JobId также нуждается в покрытии). С другой стороны, если критерии поиска FT очень избирательны, тогда индекс CreatedDate может быть опущен, и будет использоваться кластеризованный индекс для проверки кандидатов, найденных индексом FT, и проверки условия CreatedDate.

person Remus Rusanu    schedule 15.11.2009

Результат этого полностью зависит от версии SQL Server, которую вы используете. До 2008 года у SQL Server были отдельные планы запросов для каждой части запроса, когда у вас были как полнотекстовые, так и неполнотекстовые предикаты. С 2008 года вся работа теперь выполняется внутри SQL Server, и он предлагает единый план запросов.

Итог: используйте SQL Server 2008, если для вас важен полнотекстовый формат. Другая причина для этого заключается в том, что полнотекстовые индексы теперь находятся внутри базы данных и управляются так же, как и все другие объекты базы данных, в отличие от более ранних версий, где они хранились вне базы данных в файловой системе. (2005 год пытался помочь, создавая резервные копии и восстанавливая их одновременно, но это был хак по сравнению с текущим механизмом).

person Greg Low    schedule 16.11.2009