CONTAINS
述語を使用する既存のプロセスの書き換えに問題があります。既存のプロセスは を使用して動作していますがCURSOR
、非常に遅く、より多くのデータが挿入されるにつれて遅くなります。
2 つのテーブルを含む簡単な例 (以下のコード) を作成しました。1 つはFull Text IndexedCONTAINS
で、もう 1 つは最初から行を選択する条件を識別する列です。
現在のストアド プロシージャは、を使用CURSOR
して 2 番目のテーブルをループし、@filter
変数を設定してから、 を使用CONTAINS
して最初のテーブルから一致する行を検索します。問題は、それが何時間も実行され、悪化していることです。
CONTAINS
プロセスをスピードアップするために、カーソルの痛みを経験するのではなく、列の値で述語を直接使用しようとしました...しかし、構文エラーが発生しています。私の例は以下です。
私は a を実装しようとCROSS APPLY
しましたが、ユーザー定義関数 ( fnCONTAINS
) を書き込もうとしましたが、うまくいきませんでした。
IF ( object_id('Players') IS NOT NULL )
DROP TABLE Players
go
IF ( object_id('TeamNeeds') IS NOT NULL )
DROP TABLE TeamNeeds
go
-- create fulltext catalog ft as default
go
CREATE TABLE Players
(
PlayerID INT IDENTITY(1, 1),
PlayerName VARCHAR(20),
PlayerPositions VARCHAR(60)
)
go
CREATE UNIQUE INDEX IXPlayerID
ON Players( PlayerID )
go
CREATE fulltext INDEX ON Players(PlayerPositions) KEY INDEX IXPlayerID
go
INSERT Players
(PlayerName,
PlayerPositions)
VALUES( 'Patrick Travers',
'Pitcher,Left Field,Center Field,Right Field,Shortstop' )
go
CREATE TABLE TeamNeeds
(
TeamID INT,
Keywords VARCHAR(50)
)
go
INSERT TeamNeeds
(TeamID,
Keywords)
VALUES( 1,
'"Center Field" and "Shortstop" and "Pitcher"' )
go
WAITFOR delay '00:00:05'
go -- Give the Full Text Index process time to populate the catalog
SELECT PlayerID,
PlayerName,
PlayerPositions
FROM Player,
TeamNeeds
WHERE CONTAINS(PlayerPositions, Keywords)
go -- Syntax error on Keywords...
SELECT PlayerID,
PlayerName,
PlayerPositions
FROM Players,
TeamNeeds
WHERE CONTAINS(PlayerPositions, '"Center Field" and "Shortstop" and "Pitcher"')
go -- Works just fine, but requires setting an explicit search expression for every search, which is terribly slow