Intereting Posts
Ошибка SQL CLR или ошибка? Ошибка Microsoft SQL Server 18056, сбой входа в систему не совпал Свернуть таблицу ассоциации для столбца с несколькими значениями? Разделить данную дату на дни Как создать временную таблицу в SQL Server, когда у меня есть большой список идентификаторов Тупики, вызывающие «Не удалось возобновить транзакцию» с помощью NHibernate и распределенных транзакций Максимальный размер базы данных в SQL Server 2008 SQL Server, преобразующий переменное поле varchar в money / decimal / something с десятичными знаками Вопросы об индексировании в SQL Ошибка запроса с HTTP-статусом 401: Несанкционированный IN SSRS Как фильтровать запрос, чтобы показывать только результаты, когда столбец не может быть преобразован в int Как получить значения столбца в одном значении, разделенном запятой SQL Server: как удалить пунктуацию из поля? Предложение «LIKE» с оператором «AND» в SQL Server 2012 Заявление о состоянии, преобразование не удалось при преобразовании значения varchar в тип данных int

Полный текстовый запрос SQL Server для нескольких таблиц – почему так медленно?

Я пытаюсь понять производительность полнотекстового запроса SQL Server 2008, который я создаю.

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

SELECT O.ID, O.Name FROM dbo.EventOccurrence O WHERE FREETEXT(O.Name, 'query') 

т.е. все EventOccurrences со словом «запрос» в их имени. И следующий запрос, используя полнотекстовый индекс из другой таблицы, также сразу возвращается:

 SELECT V.ID, V.Name FROM dbo.Venue V WHERE FREETEXT(V.Name, 'query') 

то есть. все объекты со словом «запрос» на свое имя. Но если я попытаюсь присоединиться к таблицам и выполнить одновременно полнотекстовые запросы, то ему потребуется 12 секунд:

 SELECT O.ID, O.Name FROM dbo.EventOccurrence O INNER JOIN dbo.Event E ON O.EventID = E.ID INNER JOIN dbo.Venue V ON E.VenueID = V.ID WHERE FREETEXT(E.Name, 'search') OR FREETEXT(V.Name, 'search') 

Вот план выполнения: http://uploadpad.com/files/query.PNG

ОБНОВЛЕНИЕ: план в текстовой форме:

  |--Nested Loops(Left Semi Join, OUTER REFERENCES:([E].[ID], [V].[ID])) |--Hash Match(Inner Join, HASH:([E].[ID])=([O].[EventID])) | |--Hash Match(Inner Join, HASH:([V].[ID])=([E].[VenueID])) | | |--Clustered Index Scan(OBJECT:([iScene].[dbo].[Venue].[PK_Venue] AS [V])) | | |--Clustered Index Scan(OBJECT:([iScene].[dbo].[Event].[PK_Event] AS [E])) | |--Clustered Index Scan(OBJECT:([iScene].[dbo].[EventOccurrence].[PK_EventOccurrence] AS [O])) |--Concatenation |--Table-valued function |--Table-valued function 

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

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

Может ли кто-нибудь объяснить (i) почему это так медленно и (ii) если это даже поддерживается / если я даже понимаю это правильно.

Заранее спасибо за вашу помощь.

Solutions Collecting From Web of "Полный текстовый запрос SQL Server для нескольких таблиц – почему так медленно?"

Попробуйте переписать запрос с помощью FREETEXTTABLE и посмотреть, поможет ли это.

 SELECT O.ID, O.Name FROM dbo.EventOccurrence O INNER JOIN dbo.Event E ON O.EventID = E.ID INNER JOIN dbo.Venue V ON E.VenueID = V.ID LEFT JOIN FREETEXTTABLE(dbo.Event, Name, 'search') EFT ON E.ID = EFT.[KEY] LEFT JOIN FREETEXTTABLE(dbo.Venue, Name, 'search') VFT ON V.ID = VFT.[KEY] WHERE EFT.[KEY] IS NOT NULL OR VFT.[KEY] IS NOT NULL 

Как выполняется план выполнения этого сравнения?

 SELECT O.ID, O.Name FROM dbo.EventOccurrence O WHERE O.EventID IN ( SELECT E.ID FROM dbo.Event E WHERE FREETEXT(E.Name, 'search') UNION SELECT E.ID FROM dbo.Event E INNER JOIN dbo.Venue V ON E.VenueID = V.ID WHERE FREETEXT(V.Name, 'search') )