0

SQL Server 2008 で実行しているクエリでパフォーマンスの問題が発生しています。次のクエリがあります。

クエリ 1:

 SELECT GroupID, COUNT(*) AS TotalRows FROM Table1 
    INNER JOIN (
        SELECT Column1 FROM Table2 WHERE GroupID = @GroupID
    ) AS Table2
     ON Table2.Column1 = Table1.Column1 
WHERE CONTAINS(Table1.*, @Word) GROUP BY GroupID

Table1 には約 500,000 行が含まれています。Table2 には約 50,000 が含まれていますが、最終的には数百万になります。クエリをいじってみると、次のようにクエリを書き直すと、クエリの実行時間が 1 秒未満に短縮されることがわかりました。

クエリ 2:

SELECT GroupID FROM Table1 
    INNER JOIN (
        SELECT Column1 FROM Table2 WHERE GroupID = @GroupID
    ) AS Table2 ON Table2.Column1 = Table1.Column1 
WHERE CONTAINS(Table1.*, @Word)

私が理解していないのは、それが単純なカウント クエリであることです。表 1 に対して次のクエリを実行すると、1 秒未満で返されます。

クエリ 3:

SELECT Count(*) FROM Table1

このクエリは、結果として約 500,000 を返します。

ただし、上記の元のクエリ (クエリ 1) は 50,000 のカウントしか返さず、GROUP BY (クエリ 2) を削除するだけで実行時間が 1 秒未満に短縮されますが、実行に 3 秒かかります。

適切な列に既にインデックスがあるため、これはインデックス作成の問題ではないと思います。どんな助けでも大歓迎です。

4

2 に答える 2

0

COUNT(*) FROM tableフィルター処理、結合、グループ化などを気にする必要がないため、簡単な方法でクラスター化インデックスをより効率的にスキャンできます。より多くの仕事。カウントはそこで最も高価な部分ではありません-カウントを省略してもグループをそのままにしておくと、まだ比較的遅いと思います。たとえば、次のようになります。

SELECT GroupID FROM Table1 
    INNER JOIN (
        SELECT Column1 FROM Table2 WHERE GroupID = @GroupID
    ) AS Table2 ON Table2.Column1 = Table1.Column1 
WHERE CONTAINS(Table1.*, @Word)
GROUP BY GroupID;

無料の SQL Sentry Plan Explorer * で提供された実際の実行計画を見ると、次のように表示されます。

ここに画像の説明を入力

この:

ここに画像の説明を入力

これにより、次のことを行う必要があると思いました。

  1. Inventoryとの両方の統計を更新しA001_Store_Inventoryて、オプティマイザーがより適切な行数の見積もりを取得できるようにします (これにより、より適切なプラン シェイプにつながる可能性があります)。
  2. 暗黙的な変換を避けるために、Inventory.ItemNumberとが同じデータ型であることを確認してください。A001_Store_Inventory.ItemNumber

(*)免責事項: 私は SQL Sentry で働いています。

于 2012-08-01T15:20:39.950 に答える
0

クエリ プランを見て、要求したデータを取得するために SQL Server が何を行っているかを確認する必要があります。また、元のクエリを次のように書き換えた方がよいと思います。

SELECT
  Table1.GroupID  -- When you use JOINs, it's always better to specify Table (or Alias) names
  ,COUNT(Table1.GroupID) AS TotalRows
FROM
  Table1 
  INNER JOIN
  Table2 ON
    (Table2.Column1 = Table1.Column1) AND
    (Table2.GroupID = @GroupID)
WHERE
  CONTAINS(Table1.*, @Word)
GROUP BY
  Table1.GroupID

また、単純な COUNT と、JOIN と GROUP BY を使用した COUNT は同じものではないことに注意してください。1 つのケースでは、インデックスを調べてカウントを行うだけの問題であり、別のケースでは、他のテーブルとグループ化が関係しており、いくつかの要因によっては時間がかかる場合があります。

于 2012-08-01T15:20:45.563 に答える