2017-10-31 17 views
0

コンテキスト:SQL RDBMSとSSAS表形式に対するプレム上ダイレクトクエリーモードでMAX(日付)を効率的に処理する方法は?

  • タブローとPower BIレポートサーバー(SQL Serverの2016)
  • データの非正規化テーブル。現在約100mのレコード。

チャレンジ:

アナリストは、MAX(datecol)が必要な計算を行い

これはdirectqueryモードでDAXで可能ていないようですので、私はETLにこの背中を押して、コメントを追加しましたMaxDate列。

これは大きなテーブルで、その日までに大きくなっています。 DTAは列ストアインデックスを提案しました。それは私には意味があります。しかし、このインデックス推奨はSELECTクエリにのみ基づいていました。私はまた、挿入および削除(毎日バッチ)を持っているだろう、と彼らは続いする必要があります:

UPDATE table SET MaxDate = MAX(Datecol) 

私の直感これはcolumnstoreインデックスと素敵再生されませんが、私はテストしていませんでしたということですそれ。おそらく、クラスタ化されているのか、クラスタ化されていないのかによって異なります。

私はMaxDateをETLで処理する必要があると言っていますか? DirectQueryモードでDAXを実行しようとすると、エラーが発生します。

カラムストアインデックスで注意が必要なのは間違いですか?あるいは、索引の再構築が必要になるため、おそらく意味をなさないでしょうか?

私は、意味があり問題を避ける道を探しています。

+0

最近、男がコラムストアのインデックスで話をしたときに、あなたは彼をツイートして質問を見るように頼むことができます:https://twitter.com/SQLStijn – Tanner

+0

Tableauでmaxを扱わないのはなぜですか? – scsimon

+0

毎日のバッチのサイズはどれくらいですか? –

答えて

0

MAXA()機能を使用してメジャーを定義します。 DirectQueryモードで表2016を使用してこれを実行できます。

Max Date:=MAXA(table[datecol]) 

SQL Serverに発行されたクエリは、このようなものです:あなたが列にあるように値が必要な場合は、時に(直接クエリモードでMAXA()を使用することは不可能である

SELECT MAX([t0].[DateCol]) AS [a0] FROM ((SELECT * FROM table)) AS [t0] 

瞬間)ので、直接テーブル参照の代わりにクエリをソースとして使用するようにテーブルを変更することをお勧めします。

ご希望の場合は、その後、計算された列を作成することができます
SELECT table.*, 
     max_date= (SELECT MAX(datecol) FROM dbo.table) 
    FROM dbo.table 

days_offset = DATEDIFF(table[datecol], table[max_date], DAY) 

を*エンジンは、クエリを構築するたびに、それはサブクエリで使用されるように、あなたがセミコロンでステートメントを終了させることはできませんあなたのデータベースに。

MAX(datecol)を取得するサブクエリは、テーブルにカラムストアインデックスがある場合、またはカラムにクラスタ化されていないローストアインデックスがある場合は非常に効率的です。毎日テーブル内のすべての行を新しい最大日付に更新するよりも効率的です。

+0

興味深い。しかし、私は今、指標を定義することが私を助けているかまだ分かりません。 MaxDateは最初の段階です。次に、私はDaysOffset(DateCol - MaxDate)を持っており、ユーザーはPowerBIのDaysOffsetでフィルターをかけます。あなたはMAXA()で計算された列を作成できると言っていますか? –

+0

最新の回答をご覧ください。 – mendosi

関連する問題