8

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
4

1 に答える 1

3

私が見る限り、これは複数ステートメントの TVF でのみ可能です。

次の関数の作成

CREATE FUNCTION [dbo].[ft_test] (@Keywords VARCHAR(50))
RETURNS @ReturnTable TABLE (
  PlayerID        INT,
  PlayerName      VARCHAR(20),
  PlayerPositions VARCHAR(60))
AS
  BEGIN
      INSERT INTO @ReturnTable
      SELECT PlayerID,
             PlayerName,
             PlayerPositions
      FROM   Players
      WHERE  CONTAINS(PlayerPositions, @Keywords)

      RETURN
  END

その後、以下は正常に動作します

SELECT *
FROM   TeamNeeds
       CROSS APPLY [dbo].[ft_test] (Keywords) CA 

インライン バージョンは「全文演算子を使用しているため、インライン関数 "x" は相関パラメーターまたはサブクエリを取得できません」で失敗します。

于 2014-12-27T21:37:52.667 に答える