2

次のような文字列検索で、containstable 関数を使用したクエリを使用しています: "1-1" または同様の ("1 1" や "a a" など) 問題は、クエリが長すぎて多くの結果が得られないことです。 . 同じクエリの代わりに、より多くの結果を取得する「a」などの他の検索文字列を使用すると、完了までの時間が大幅に短縮されます。これはクエリです:

SELECT     COUNT(d.DocumentID) 
FROM       KnowledgeIndex_Data.dbo.Document d
INNER JOIN CONTAINSTABLE ( KnowledgeIndex_Data.dbo.Document , * , '"1-1"' ) ftt 
        ON ( d.DocumentID = ftt.[Key] )

注: フルテキスト インデックスのストップ ワード リストには、1 が含まれていません。

何が起こっているのか知っていますか?ありがとう!

実行計画はこちら

プラン

テーブル Document の作成スクリプトは次のとおりです。

CREATE TABLE dbo.Document
(
      DocumentID int IDENTITY (1, 1) NOT NULL -- Local int for cross reference tables to save 12 bytes per record
    , DocumentGUID uniqueidentifier NOT NULL

--  , DocumentTypeID tinyint NOT NULL
    , DocumentSourceID smallint NOT NULL -- New Document Source identifier
    , SourceDocumentID nvarchar(80) NOT NULL --crb 2011/08/23 changed from nvarchar(40) to support PageCodes -- asw 2010/02/12 renamed to make purpose more clear

    , DocumentStructureID tinyint NOT NULL -- New Document Structure identifier

    , SortOrder nvarchar(450) NOT NULL -- 2010/06/18 bdw- Add the Sort Order column and index to the Document table

    , ResultDisplayContent xml (DOCUMENT DocumentResultDisplayContentSchemaCollection) NOT NULL  -- Required For All DocumentTypes -- jci 2011/02/22 DOCUMENT added -- jci 2010/07/02 xml schema added
    , DetailDisplayContent xml (DOCUMENT DocumentDetailDisplayContentSchemaCollection) NULL -- Only required for some DocumentTypes -- jci 2011/02/22 DOCUMENT added  -- jci 2011/0/31 xml schema added
    , TeaserDisplayContent xml (DOCUMENT DocumentResultDisplayContentSchemaCollection) NULL -- Teaser Result data. Optional, replaced with main ResultDisplayContent if null. -- jci 2011/02/22 DOCUMENT added -- jci 2010/07/02 xml schema added

, TitleQueryContent nvarchar(max) NOT NULL
, QueryContent nvarchar(max) NOT NULL

, CreatedAt datetimeoffset(2) NOT NULL

, CONSTRAINT pcDocument PRIMARY KEY CLUSTERED -- jci 2011/07/01 replaced -- CONSTRAINT pncDocument PRIMARY KEY NONCLUSTERED
    ( DocumentID ) WITH FILLFACTOR = 100
, CONSTRAINT fkDocumentDocumentSourceID FOREIGN KEY
    ( DocumentSourceID )
    REFERENCES dbo.DocumentSource ( DocumentSourceID )
    ON DELETE CASCADE
, CONSTRAINT fkDocumentDocumentStructureID FOREIGN KEY
    ( DocumentStructureID )
    REFERENCES dbo.DocumentStructure ( DocumentStructureID )
    ON DELETE CASCADE
)
GO

そしてインデックス:

-- Create Index On Table
CREATE FULLTEXT INDEX ON dbo.Document(QueryContent LANGUAGE N'English' , TitleQueryContent LANGUAGE N'English')
    KEY INDEX pcDocument -- 2011/07/01 replaced --pncDocument
    ON (FILEGROUP SECONDARY)
    WITH STOPLIST = SrsStopWordList -- Use SrsStopWordList
        , CHANGE_TRACKING = OFF , NO POPULATION; -- Update Manually For Performance

GO
4

2 に答える 2

0

検索用語に対して sys.dm_fts_parser を実行すると、次の結果が得られます -

select  *from sys.dm_fts_parser('"1-1"', 1033, 0 ,0)

display_term    expansion_type  source_term
1                0       1-1
nn1              0       1-1
1                0       1-1
nn1              0       1-1

そのため、フルテキスト エンジンは 4 つの異なる検索語句を検索し、結果を結合することになります。display_term LIKE '1' または 'nn1' を使用してテーブルで sys.dm_fts_index_keywords を実行し、結果を共有していただけますか? それは長い実行時間を説明するのに役立つかもしれません。

于 2012-11-14T16:35:49.153 に答える
0

そのクエリを次のように実行しました。

   SELECT count(*) FROM sys.dm_fts_index_keywords(db_id('KnowledgeIndex_Data'),              object_id('dbo.Document'))
   where display_term like '%1-1%'
   GO

'%nn1%' で 685053 を返しました '%engine%' で 413578 を返しました 2500 を返しました

1 は、フルテキスト インデックスのノイズ ワードではないことに注意してください。それが関係していると思いますか?

テーブルのすべてではなく一部を使用して CONTAINSTABLE を実行することは可能でしょうか?

CONATINSTABLE はすべてのテーブル dbo.Document で検索を行い、実際にはそのクエリの後、CONTAINSTABLE に不要な作業をさせている Document のフィールドに WHERE を適用します。ありがとう!

于 2012-11-14T18:27:05.597 に答える