0

Table_X には 7000 行が含まれます Table_Y には 1 000 000 行が含まれます

この要求は SQL Server2005 では高速に実行されますが、SQL Server 2008 では 3 分かかります

SELECT [Extent1].[ID] AS [ID]   
FROM [dbo].[TableX] AS [Extent1]
INNER JOIN [dbo].[TableY] AS [Extent2] ON [Extent1].[ID] = [Extent2].[Fk_Id]
WHERE (
    (
        [Extent2].[Fk_Id] IN (
            (
                SELECT [KEY]
                FROM CONTAINSTABLE([TableX], (Description), N'"PMI_Log"') [CT]
                )
            )
        )
    OR (
        [Extent2].[id] IN (
            (
                SELECT [KEY]
                FROM CONTAINSTABLE([TableY], (Description), N'"PMI_Log"') [CT]
                )
            )
        )
    )

すでにインデックス、統計、およびカタログを再構築しています。

2 つのサブクエリ (select..FROM ContainsTable...) には 15 ミリ秒かかります

実行計画は、テーブル値関数 [FulltextMatch] で 100% の時間がかかると言っています。

多くのテストを行った結果、フルテキスト クエリの間に OR を挿入すると、パフォーマンスが低下することがありました。

誰かが助けることができますか?

どうも、

この質問は明らかに同じ問題です:クエリで複数の CONTAINSTABLE を使用すると、SQL Server 2008 全文検索 (FTS) が非常に遅くなる

4

1 に答える 1

2

これは、 SQL 2008 / 2008 R2の既知の問題です。2008 SP1 CU9および2008 R2 CU4で修正されました。

回避策として、クエリを 2 つに分割しUNIONて結果を得ることができます。

SELECT 
   [Extent1].[ID] AS [ID]   
FROM 
   [dbo].[TableX] AS [Extent1]
   INNER JOIN [dbo].[TableY] AS [Extent2] 
   ON [Extent1].[ID] = [Extent2].[Fk_Id]
WHERE
   [Extent2].[Fk_Id] IN 
   (
      SELECT [KEY]
      FROM CONTAINSTABLE([TableX], (Description), N'"PMI_Log"') [CT]
   )

UNION

SELECT 
   [Extent1].[ID] AS [ID]   
FROM 
   [dbo].[TableX] AS [Extent1]
   INNER JOIN [dbo].[TableY] AS [Extent2] 
   ON [Extent1].[ID] = [Extent2].[Fk_Id]
WHERE
   [Extent2].[Fk_Id] IN 
   (
      SELECT [KEY]
      FROM CONTAINSTABLE([TableY], (Description), N'"PMI_Log"') [CT]
   )
于 2013-07-25T15:31:26.100 に答える