約のファクトテーブルで構成される単純な表形式モデルがあります。20百万。レコード (販売トランザクション) と、約 600.000 レコード (顧客) を含むディメンション テーブル。
典型的なレポート シナリオは、ファクト テーブル内の何らかの基準で上位 10 人の顧客を取得することです。他の基準 (通常は期間、製品など) でフィルター処理することもできます。
Excel で、2000 万をすべて集計します。総売上高を返すレコードは瞬時です。ただし、顧客ごとにグループ化しようとすると、すべてのデータを取得するのに時間がかかります (15 ~ 20 秒)。これは、表示する必要がある顧客 (600.000) が非常に多いためです。
ここで、上位 10 人の顧客だけを取得するために Excel で値フィルターを適用すると、結果が返されるまでに約 15 ~ 20 秒かかります。製品、時間などの他の属性をスライスしながら)。
内部的に、Excel はTOPCOUNT
、値フィルターを使用して表形式モデルを照会するときに MDX 関数を使用します。
これらの種類のクエリを高速化するために、テーブル モデルでできることはありますか?
私はもう試した:
- ディメンション テーブルに、各顧客の合計売上高を含む計算列を作成します。パフォーマンスは向上しますが、この列の値はファクトの他の属性によってスライスすることができず、列には明らかに多くの個別の値が含まれることになるため、これは適切な方法ではありません (これは表形式では悪いことです)。
- ここで
RANKX
提案されている DAX 関数を使用して、ファクト テーブルで計算されたメジャーを作成します。これにより、Tabular インスタンスがクラッシュしました (ディメンション テーブル内のレコードが多すぎますか?) TOPN
DAX関数を使用して、テーブル モデルで単純な DAX ステートメントを直接実行します。TOPCOUNT
これは、 MDX アプローチよりも 3 ~ 4 倍遅くなりました。