MDX のパフォーマンスとT-SQL
-
16-09-2019 - |
質問
6 億を超えるレコードを含むテーブルと、データベース上で複雑な検索操作を実行する一連のストアド プロシージャを含むデータベースがあります。ストアド プロシージャのパフォーマンスは、テーブルに適切なインデックスがあっても非常に遅くなります。データベースの設計は、通常のリレーショナル データベース設計です。データベース設計を多次元に変更し、従来の T-SQL クエリの代わりに MDX クエリを使用したいのですが、問題は次のとおりです。MDX クエリはパフォーマンスの点で従来の T-SQL クエリよりも優れていますか?はいの場合、クエリのパフォーマンスはどの程度向上しますか?
助けていただきありがとうございます。
解決
リンゴとオレンジ:Analysis Services OLAP キューブは、SQL Server データベースとは根本的に異なる種類のストレージであり、異なることを実行するように設計されています。技術的には、MDX は T-SQL よりも「高速」ではなく、その逆も同様です。MDX は単なる言語ですが、さまざまなニーズに合わせて設計されています。
そうは言っても、通常は立方体が最も効果的です。 数値 静的データの分析(大量の販売、取引、その他の記録を長期にわたって集計するなど)。対照的に、スキーマとインデックスが適切に構築されていれば、従来のリレーショナル データベースは通常、検索に問題なく機能します。簡単な判断方法:SQL クエリで多くのことを実行する必要がある場合
select grock, sum/min/max/avg( foo )
from bar
group by grock -- Ideal Analysis Services problem
その場合はキューブが役に立つかもしれません (これは集計数学関数 - sum() と group by 用に設計されています)。OTOH クエリで多くの処理が実行される場合
select cols
from foo
where <complicated search> -- Not so much
その場合、キューブはおそらく役に立たず、代わりにスキーマ、クエリ、インデックス作成、そしてデータが適切にパーティション化できる場合はテーブルのパーティション化の調整に重点を置くと思います。
クラスター化インデックスと、クエリに一致する非クラスター化インデックスをカバーしていますか?
他のヒント
MS SSAS OLAP キューブは、いくつかのストレージ モードで使用できます。
リレーショナル (OLAP) - データとメタデータは DB に残り、さらにいくつかのマテリアライズド ビューが追加されます。速いかもしれないし、そうでないかもしれません。
ハイブリッド (HOLAP) - メタデータと (事前計算された) 集計は、SSAS インスタンスを実行する新しいサーバーに保存されます。これにより、「昨年の月ごとの総従業員時間」などの集計を使用するすべてのクエリが高速化されますが、特定のレコードにドリルスルーするクエリは以前と同様になる可能性があります。
すべてのデータとメタデータおよび集計が SSAS サーバーにコピーされる多次元 OLAP (MOLAP)。これは通常最も高速ですが、ストレージが重複します。
これを開始する前に、レポートと分析用にテーブル レイアウトを最適化することを検討する必要があります。つまり、データ ウェアハウス (DW) を使用し、データを Kimball スター ディメンションとファクト テーブルに配置します。次に、ETL(SSIS) を使用して DW を定期的に読み込み、レポートと分析を DW に向けます。SSAS をまったく使用する必要がない場合もあります。スター テーブル レイアウトに対して実行される SQL クエリは、通常、正規化された DB 運用データベースに対して実行するよりもかなり高速です。これでも遅すぎる場合は、DW 上に SSAS キューブを構築します。DW のロードを開始すると、運用データベースからレコードを削除できる場合があり、日常の使用を高速化できます。
要約すると、私の経験則は次のようになります。
1.DW を構築し、ETL プロセスを設定する
2.DW に対して T-SQL レポートを試してみてください。これで十分かもしれません。
3.それでも遅い場合は、HOLAP モードで SSAS キューブを (DW 上に) 構築し、MDX を使用してクエリを実行します。
「適切なインデックスを使用してもストアド プロシージャのパフォーマンスが非常に遅い」
ストアド プロシージャが本当の問題であるとしたら、私は驚きます。プロシージャの使用方法が遅いのかもしれませんが、ストアド プロシージャの定義上、ストアド プロシージャが遅くなるわけではありません。自分の手続きの何が遅いのか分かりましたか?彼らのプロフィールを作成しましたか?私なら、データベースを再設計する前に、そのルートを徹底的に検討します。多次元データベースは OLAP 用です。データベースは厳密に OLAP データベースですか、それとも OLAP と OLTP のハイブリッドですか?おそらく、OLTP 設計内のデータを非正規化し、非正規化 d 構造に複製する必要があるでしょうか?テーブル内の 6 億レコードは決して大きいわけではありませんし、小さいわけでもありませんが、だからと言ってストアド プロシージャを削除すれば魔法のように処理が高速になるとは思えません。問題を解決するためにより大きなプロジェクトに取り掛かる前に、ストアド プロシージャをプロファイリングし、パフォーマンスのボトルネックがどこにあるのかを確認します。
PowerPivot (Excel アドオン) を検討したことがありますか?垂直圧縮を使用してデータをローカルで約 95% 圧縮するため、心ゆくまで分析できます。