Полнотекстовый поиск с внутренним соединением очень медленный - PullRequest
2 голосов
/ 15 февраля 2011

У меня следующий запрос, который выполняется очень медленно:

SELECT Id FROM
    (
        SELECT  E.MessageId
        FROM    [MessageEnvelopes] AS E INNER JOIN
                [Folders] AS F ON F.Id = E.FolderId
        WHERE   F.MailboxId = 1
    ) AS SUB1 INNER JOIN
    (
        SELECT  M.Id
        FROM    [Messages] AS M 
        WHERE   CONTAINS(M.*, '"my*" AND "search*"')
    ) AS SUB2
    ON SUB1.MessageId = SUB2.Id

По сути, это объединяет запрос выбора сообщения (SUB1) с полнотекстовым поиском (SUB2). Подзапросы были разделены для ясности (то же самое происходит, когда подзапросы объединены). Этот запрос занимает около 15 секунд, в то время как оба подзапроса немедленно возвращаются при выполнении по отдельности.

Используемые таблицы маленькие (макс. 2000 строк). Есть индексы на все внешние ключи. План выполнения не показывает узких мест. Я понятия не имею, почему этот запрос будет работать так медленно.

1 Ответ

1 голос
/ 15 февраля 2011

Я полагаю, что план запроса показывает, что три таблицы объединены перед оценкой FullTextMatch.Если вы выполняете запросы отдельно, вы заставляете план сравнивать FullTextMatch с сообщениями перед объединением.Это может быть хорошо или плохо для вас, в зависимости от того, сколько данных в таблицах и насколько «селективно» предложение where по отношению к MailboxId.Если вы видите, что у вас намного лучшая производительность с разделенными запросами, вы можете использовать две табличные переменные для хранения промежуточного результата и запроса переменных для объединенного вывода.

...