Как вы выполняете полнотекстовый поиск по нескольким критериям в левых таблицах в SQL Server? - PullRequest
0 голосов
/ 30 августа 2008

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

select c.Id, c.Name, c.CountryCode, c.CustomerNumber, cacc.AccountNumber, ca.Line1, ca.CityName, ca.PostalCode
from dbo.Customer as c
left join dbo.CustomerAddress as ca on ca.CustomerId = c.Id
left join dbo.CustomerAccount as cacc on cacc.CustomerId = c.Id
where  c.CountryCode = 'XX' and (cacc.AccountNumber like '%C17%' or c.Name like '%op%'       
or ca.Line1 like '%ae%' or ca.CityName like '%ab%' or ca.PostalCode like '%10%')

В базе данных с 90 000 записей этот запрос занимает около 7 секунд (очевидно, что все объединения и лайки облагаются налогом).

Я пытался найти способ сократить время выполнения запроса с помощью полнотекстового поиска по соответствующим столбцам. Однако я не видел пример полнотекстового поиска с тремя объединениями таблиц, подобным этому, тем более что мое условие объединения не является частью поискового запроса.

Есть ли способ сделать это в полнотекстовом поиске?


@ David

Да, на идентификаторах есть индексы.

Я попытался добавить индексы для компонента CustomerAddress (CityName, PostalCode и т. Д.), И запрос снизился до 3 секунд, но я все еще нахожу это слишком медленным для чего-то подобного.

Обратите внимание, что все текстовые поля (за исключением идентификаторов) являются nvarchars, а Line1 является nvarchar 1000, так что это может повлиять на скорость, но все же.

Ответы [ 3 ]

1 голос
/ 30 августа 2008

Я бы повторил предложение Дэвида. Возможно, вы захотите проверить, как СУБД выполняет ваш запрос (например, с помощью сканирования таблиц или использования индексов).

Одной быстрой проверкой было бы определение времени только части запроса, связанной с текстовым поиском. Примерно так:

SELECT  ca.Line1, ca.CityName, ca.PostalCode
FROM    CustomerAddress as ca
WHERE   ca.CustomerId = <some id number>
AND     (ca.Line1 LIKE '%ae%' OR ca.CityName LIKE '%ab%' OR ca.PostalCode LIKE '%10%');

Если это занимает много времени, то проблема заключается в LIKE (удалите одно выражение за раз из строки OR, чтобы увидеть, вызывает ли замедление только один из этих столбцов). Если это быстро, то соединения являются подозрительными.

Вы можете написать аналогичный запрос и для таблицы CustomerAccount.

1 голос
/ 30 августа 2008

Запустите его через анализатор запросов и посмотрите, каков план запроса. Я полагаю, что поиск в двойном корне (т.е.% ae%) вызывает сканирование таблицы при поиске совпадающих строк. Поиск в двойном корне медленен по своей природе, так как вы не можете использовать какой-либо индекс для его соответствия обычно.

1 голос
/ 30 августа 2008

ПРИМЕЧАНИЕ. На самом деле это не ответ, а попытка выяснить, что на самом деле может вызывать проблемы с производительностью.

90000 записей - это довольно небольшой набор данных, и запрос относительно прост с двумя объединениями. Есть ли у вас индексы на CustomerAddress.CustomerId и CustomerAccount.CustomerId? Похоже, что это скорее вызывает проблемы с производительностью, чем условие LIKE. Вы обычно ищете, чтобы найти совпадение во всех этих столбцах одновременно?

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