0

私たちの Wiki のページが特定のマクロを参照する回数をまとめた表を作ろうとしています。

次のような55k行の@currentpagesという一時テーブルを作成しました。

DECLARE @currentpages table(
ContentID       NUMERIC(19,0) NOT NULL PRIMARY KEY,
PageTitle       VARCHAR(255) NULL,
SpaceKey            VARCHAR(255) NULL,
OriginalAuthor  VARCHAR(255) NULL,
LastChangedBy   VARCHAR(255) NULL,
LastChangedDt   VARCHAR(10) NULL,
ContentBody         TEXT NULL); 

そして、次のような別のテーブル:

DECLARE @usage table(
SpaceKey        VARCHAR(255) NOT NULL PRIMARY KEY,
Macro1      NUMERIC(19,0) NULL,
Macro2      NUMERIC(19,0) NULL,
Macro3              NUMERIC(19,0) NULL);

(上記を簡略化しました。実際には、Macro1、Macro2 などのように約 40 列あります) これらのさまざまなマクロへの (@currentpages 内の) 参照の数を取得しようとしています。

可能な SpaceKey 値ごとに行を作成し、すべての Macro"x" カウンターをゼロにして、@usage テーブルを初期化します。

INSERT INTO @usage (SpaceKey, Macro1, Macro2, Macro3)
SELECT S.spacekey, 0, 0, 0
FROM spaces     S
ORDER BY S.spacekey

次に、いくつかの UPDATE ステートメントの最初のステートメントを実行して、各マクロ参照を識別します。

UPDATE @usage
SET U.AdvancedSearch = C.Counter
FROM @usage                 U
INNER JOIN (SELECT SpaceKey, COUNT(*) AS Counter 
    FROM @currentpages 
    WHERE ContentBody LIKE '%{search-%' GROUP BY SpaceKey) C 
        ON U.SpaceKey = C.SpaceKey

これは正常に動作しているように見えますが、非常に長時間実行されます。私がやろうとしていることをより効率的に行う方法はありますか?

このデータベースは SQL Server 2005 上にあります。

どうもありがとう、ベッツィ

4

3 に答える 3

1
  1. 全文検索を調べます。(全文検索 @ MSDN ) 経験がないので、アドバイスはできません。

  2. @CurrentPages をマクロごとに 1 回クエリする代わりに、すべてのマクロ カウントを一度に取得します。何かのようなもの:

    INSERT INTO @usage (SpaceKey, Macro1, Macro2, Macro3)
    SELECT S.spacekey
        , count(case when ContentBody LIKE '%Search Macro 1%' 
            then 1 else null end) as Macro1_Count
        , count(case when ContentBody LIKE '%Search Macro 2%' 
            then 1 else null end) as Macro2_Count
        , count(case when ContentBody LIKE '%Search Macro 3%' 
            then 1 else null end) as Macro=3Count
    FROM spaces S
    LEFT OUTER JOIN @CurrentPages C ON C.SpaceKey = S.SpaceKey
    GROUP BY S.spacekey
    
于 2011-08-03T10:34:28.890 に答える
0

マクロごとに列を作るのではなく、このように表を作ります。

DECLARE @macrotype table(
    type      int          NOT NULL PRIMARY KEY
  , MacroName varchar(100) NOT NULL 
  , mask      varchar(100) NOT NULL 
)

DECLARE @usage table(
  SpaceKey    VARCHAR(255) NOT NULL PRIMARY KEY,
, MacroType   int NOT NULL 
, MacroCount  int NOT NULL 
)

それができたら、実行して入力できます

  INSERT INTO @macrotype VALUES (1, 'search', '%{search-%')
                              , (2, 'yadayada', '%{yadayada-%')
                              , ...

  DECLARE @c int, @m varchar(100)
  DECLARE c CURSOR READ_ONLY FOR SELECT type, mask FROM @macrotype
  OPEN c

  FETCH NEXT FROM c INTO @t, @m

  WHILE @@FETCH_STATUS = 0 
    BEGIN
      INSERT INTO @usage (SpaceKey, MacroType, MacroCount)
      SELECT SpaceKey
           , @t
           , COUNT(*) AS Counter 
        FROM @currentpages
       WHERE ContentBody LIKE @m
    GROUP BY SpaceKey
    FETCH NEXT FROM c INTO @t, @m
  END
  CLOSE c
  DEALLOCATE c

ストーリーの最後で、@usage テーブルにクエリを実行して、任意の形式でカウントを作成できます。

  SELECT MacroName, count = count(*)
    FROM @usage u
    JOIN @macrotype m
      ON u.MacroType - m.type
GROUP BY MacroName

55k レコードでは、これは数分間実行されます。

于 2011-08-02T13:50:10.923 に答える
0

フル テーブル スキャンを実行するため、パフォーマンス ヒットは LIKE 句を含むサブクエリから発生すると思います。他に何がこれを遅くしすぎるのか、私には本当にわかりません。

サブクエリだけを実行し、戻るのにかかる時間を列の 1 つで更新全体にかかる時間と比較することで、それをテストできます。

于 2011-08-02T13:07:01.630 に答える