5

製品属性を含む 17Mil 行のテーブルがあり、次のようにします。

brandID、sizeID、colorID、price、shapeID

そして、ブランドとサイズごとに集計を照会する必要があります。現在、次のようにして、このデータのクエリとフィルタリングを行います。

select brandID, sizeID, count(*) 
from table where colorID in (1,2,3) and price=10 and shapeID=17
--"additional complex where clause here"
group by brandID, sizeID
order by brandID, sizeID

そして、このデータを報告します。問題は、返される実際のデータが数百行にすぎないにもかかわらず、このクエリを実行するのに 10 秒ほどかかることです (これは非常に単純な例です)。

このテーブルにインデックスを作成する容量に達したと思うので、インデックスの量がいくらあってもすぐに結果が得られるとは思えません。

私は OLAP やその他の分析サービスについてほとんど知りませんが、上記のようなクエリ (または同等のデータを返す同様のクエリ) を実行できるように、このテーブルを事前にフィルター処理または事前に集計できる SQL Server には何がありますか? または非常に大きなテーブルで任意の where 句を処理する最良の方法は何ですか?

4

4 に答える 4

4

これはオラップ キューブの完璧な候補だと思います。数億行のファクト データがあります。私はあなたが上で説明した種類のクエリを実行していましたが、クエリは数分で戻ってきました。これを OLAP キューブに移動したところ、クエリはほぼ瞬時に実行されるようになりました。Olap には少し学習曲線があります。単純な立方体の構築に関するチュートリアルを見つけて、理解を深めることを強くお勧めします。DBA の同僚はキューブについて何年も前から話していましたが、まったく理解できませんでした。なぜ私がそれなしでそんなに長く行ったのか、今ではわかりません。

OLAP に加えて、インデックス付きビューを調査することもできますが、いくつかの方法でデータをスライスしている場合、それは実行できない場合があります。

于 2009-10-02T20:21:13.437 に答える
0

テーブル構造、物理環境、(非) クラスター化インデックスなどの詳細がなければ、最初にボトルネックを探すのは、クエリの「実行計画の表示」、データベース エンジン チューニング アドバイザ、および SQL プロファイラです。お役に立てれば。

于 2009-10-02T20:19:24.000 に答える
0

インデックスとスキーマに依存

とにかく、このクエリのインデックスは次のいずれかである必要があります

CREATE INDEX IX_foo ON table (shapeID, price, colorID) INCLUDE (brandID, sizeID)
CREATE INDEX IX_foo ON table (shapeID, price, colorID, brandID, sizeID)

ただし、適切な回答を緩和する「追加の複雑な where 句をここに追加」を追加しました

私の考え:

  • 行数を減らすため、WHERE 句は重要です。
  • ORDER BY は集計/WHERE ほど重要ではありません
  • クエリをカバーしてキー ルックアップを削除する

余分なもの:

  • (1,2,3) の colorID は OR であるため不適切です
  • 暗黙的な変換を避けるために、パラメータのデータ型が列のデータ型と正確に一致していることを確認してください
  • shapeID、Price、colorID を少し入れ替えて、最適なものを確認できます (または、いくつかのインデックスを作成して、どれが使用されているかを確認できます)。
  • サーバーのボトルネックはありますか (SQL Express での実行など)?
于 2009-10-02T20:21:36.103 に答える
0

SQL 2008 を使用していて、特定の頻繁に使用されるフィルタリングがある場合は、フィルター処理されたインデックスの使用を検討してください (gbn が提案するように、おそらく INCLUDE インデックスと組み合わせて)。

sizeID 値が 5 つしかないとします。現在のインデックスを複数のフィルター処理されたインデックスに分割できます (例: "WHERE sizeID = 1")。

フィルタリングを INCLUDE と組み合わせて使用​​すると、クエリがはるかに高速に返されます。

参照: SQL Server 2008 のフィルター処理されたインデックスの探索

于 2009-10-02T21:56:54.487 に答える