ストレージ エンジン – LuckyTemplates での DAX クエリの最適化におけるその役割

このチュートリアルでは、分析サービス内の 2 番目のエンジンであるストレージ エンジンを見ていきます。

過去のチュートリアルで、トップレベル エンジンであるフォーミュラ エンジンについて説明しました。ユーザーがこれら両方のエンジンがどのように機能するかを理解すると、DAX クエリの最適化とパフォーマンスの向上が容易になります。

ストレージ エンジンの主な目的は、データベースを直接操作することです。

数式エンジンはデータベースに直接アクセスできないため、通常、この目的のためにストレージ エンジンを経由します。

ストレージ エンジンには、インポート モードと DirectQuery の2 つのタイプがあります。同じデータ モデル内で両方のタイプを組み合わせて、複合モデルを作成できます。

目次

ストレージ エンジンでのインポート モードの使用

まず、インポートモードについて説明します。これは Vertipaq としてもよく知られていますが、xVelocity または In Memory Columnar Database とも呼ばれます。

インポート モードの仕組みについて理解する必要がある重要な点が 4 つあります。

まず、Vertipaq はデータ ソースから直接データのコピーを作成し、それを圧縮形式で RAM に保存します

次に、インポート モードで処理されるデータは、最後の更新操作に基づいています。これは、データを先週更新したのであれば、扱っているデータは先週と同じデータであることを意味します。これは、1 つのテーブルがインポート モードで、もう 1 つのテーブルが DirectQuery モードである複合セットアップを使用している場合に特に重要です。

先週更新された Products テーブルがインポート モードで存在するとします。Sales テーブルについては、そのサイズのため、DirectQuery を使用することにしました。また、Brand 列を取り込み、同じ Sales テーブルに対して Total Sales メジャーを作成する両方のテーブルに基づいてレポートを作成していると仮定します。また、ブランドに基づいて売上高を視覚化したいと考えています。

DirectQuery からは最新の更新されたデータが得られ、Vertipaq からは古いデータが得られる可能性があるため、最初にインポート モードからのデータを更新する必要があります。これにより、マトリックスとビジュアライゼーションにいくつかの空白行が残ります。

Vertipaq について次に知っておく必要があるのは、などの基本的な操作のみがネイティブで使用できるということです。これは、クエリ プランに他のより複雑な操作が含まれている場合、ストレージ エンジンはコードのこの部分を解決するために数式エンジンを呼び出す必要があることを意味します。

最後に、ストレージ エンジンは、Vertipaq の列構造により高度に最適化されたデータベースです。これは、すべてのデータが行ごとではなく列ごとに保存されることを意味します。この構造により、リレーショナル データ モデルにインデックスを作成した場合でも、Vertipaq は常に DirectQuery 接続よりも高速になります。

ストレージ エンジンでの DirectQuery の操作

LuckyTemplates 分析サービス内の次のオプションは DirectQuery です。DirectQuery 接続を使用する場合、分析サービスは、数式エンジンによって送信されるクエリのパススルーとしてのみ機能します。

そこで、クエリを書いたとします。数式エンジンはクエリ プランを生成します。その後、データベースの母国語に翻訳されたクエリがストレージ エンジンに転送されます。ほとんどの場合、これらのクエリは SQL で送信されます。

クエリで DirectQuery を使用する場合は、クエリが常に最新であることが期待されます。最後にデータを更新したのがいつかについて心配する必要はありません。

DAX コードとデータ モデルを最適化するプロセスは、リレーショナル データベースの作成方法によっても異なります。列にインデックスがある場合、クエリは常に最適化されます。ただし、分析サービスまたは LuckyTemplates を使用したレポートの作成に関してデータベースが最適化されていない場合は、いくつかのパフォーマンスの問題に直面する可能性があります。したがって、レポート開発用にデータベースを意図的に構築してください。

複合モデルの操作

3 番目のオプションは、複合モデルを作成して、インポート モードで 1 つのテーブルを作成し、DirectQuery で別のテーブルを作成できるようにすることです。

異なるソースからの 2 つのテーブルを使用する場合、数式エンジンは 1 つのリクエストを Vertipaq に送信し、もう 1 つのリクエストを DirectQuery データ ソースに送信します。どちらの場合も、分析サービスは Vertipaq と DirectQuery の両方からデータ キャッシュも取得します。数式エンジンは、結果をエンド ユーザーに提供する前に、両方のデータ キャッシュで JOIN 、、または任意の反復を使用します。

そこで、レポートで製品のブランドごとの売上高を視覚化しようとしているとします。フォーミュラ エンジンは Vertipaq にリクエストを送信し、そこで製品、ブランド、プロダクト キーを取得します。次に、DirectQuery から、売上、正味価格、販売数量、および販売プロダクト キーを取得しようとします。

プロダクト キーに基づいて 2 つのデータ キャッシュを取得すると、2 つのデータ キャッシュを結合して合計売上額を計算します。その後、結果がエンド ユーザーに表示されます。

ストレージ エンジンに関するその他の重要なポイント

さまざまな種類について説明しましたが、DAX クエリを最適化するためにストレージ エンジンについて知っておく必要がある重要な要素が他にもいくつかあります。

前に述べたように、ストレージ エンジンは、非圧縮データ キャッシュの形式でデータ キャッシュを数式エンジンに返します。インポート モードの場合、プロセス内で Vertipaq に送り返されるリクエストは xmSQL 言語で実行されます。

xmSQL 言語は SQL に似ていますが、完全に同じではありません。xmSWL については、別のチュートリアルでクエリ プランについて説明するときに詳しく説明する予定です。

ストレージ エンジンは CPU で利用可能なすべてのコアを使用することを覚えておくことも重要です。複数のコアを使用できる機能は、データ モデル内に複数のセグメントがある場合に役立ちます。

LuckyTemplates に 1,200 万行のテーブルがあるとします。Power Pivot と LuckyTemplates の両方で各セグメントが 100 万行に適合するため、このテーブルは 12 のセグメントに分割されます。これは、1 セグメントに 800 万行を収容する一般的な分析サービスとは異なります。

したがって、CPU に 6 つのコアがある場合、6 つのコアすべてが 12 セグメントの最初の 6 つを同時にスキャンします。完了したら、次の 6 つのセグメントに進みます。

しかし、デフォルトのセグメントが 800 万行を保持する分析サービスを使用している場合、6 つのコアのうち 2 つだけが使用されます。1 つのセグメントは 800 万行を処理し、もう 1 つは 400 万行を処理します。

複雑なクエリの処理

前に、インポート モードは MIN、MAX、SUM、COUNT、GROUPBY などの基本的な操作のみをサポートしていると述べました。では、より��雑なクエリを処理するとどうなるでしょうか?

行コンテキストで IF ステートメントを使用するか、Products テーブルと Sales テーブルに対して SUMX のようなネストされた反復を使用することに決めたとします。

この場合、ストレージ エンジンは独自にクエリを解決できません。次に、数式エンジンが呼び出され、ストレージ エンジン内で行ごとに複雑な計算の解決が開始されます。両方のエンジンが連携して動作するため、これは好ましいシナリオだと考える人もいるかもしれませんが、これは真実とは程遠いです。

これが発生すると、特定のクエリに callbackdataID がある場合、ストレージ エンジンによって生成されたデータ キャッシュをキャッシュできなくなります。したがって、ビジュアルを更新すると、たとえ数秒前に同じクエリを実行したばかりであっても、数式エンジンとストレージ エンジンの両方で同じ計算を実行する必要があります。これはパフォーマンスの遅延やユーザー エクスペリエンスの低下につながります。

また、ストレージ エンジンは、クエリが DAX と MDX のどちらを使用して実行されたかを認識しないことにも注意してください。前に述べたように、クエリ プランを渡す前にクエリを適切な言語に変換するのが数式エンジンの仕事です。

最後に、数式エンジンはクエリを 1 つずつストレージ エンジンに送信します。これは、複数のセグメントを同時にスキャンすることで、Vertipaq 内での全体的なスキャン時間を短縮できるように、複数のセグメントを持つ方が実際に優れていることを意味します。


LuckyTemplates の DAX: DAX Studio での数式エンジンを使用した最適化
DAX クエリの最適化テクニックとレッスン
クエリのパフォーマンスと DAX Studio のセットアップ

結論

ストレージ エンジンの詳細を理解することは、特に DAX Studio を使用している場合に、DAX クエリを最適化するのに役立ちます。数式エンジンについて説明したチュートリアルも読んでいれば、よりパフォーマンスの高いクエリを作成する方法についてより適切な決定を下すことができます。

フォーミュラエンジンはトップレベルのエンジンですが、両方のエンジンを最大限に発揮しなければ本来の性能を発揮できないことは間違いありません。

ではごきげんよう、


Power Automate の文字列関数: Substring と IndexOf

Power Automate の文字列関数: Substring と IndexOf

Microsoft フローで使用できる 2 つの複雑な Power Automate String 関数、substring 関数とindexOf 関数を簡単に学習します。

LuckyTemplates でビジュアル ツールチップを作成する

LuckyTemplates でビジュアル ツールチップを作成する

LuckyTemplates ツールチップを使用すると、より多くの情報を 1 つのレポート ページに圧縮できます。効果的な視覚化の手法を学ぶことができます。

Power Automate で HTTP 要求を行う

Power Automate で HTTP 要求を行う

Power Automate で HTTP 要求を作成し、データを受信する方法を学んでいます。

LuckyTemplates で日付テーブルを作成する方法

LuckyTemplates で日付テーブルを作成する方法

LuckyTemplates で簡単に日付テーブルを作成する方法について学びましょう。データの分析と視覚化のための効果的なツールとして活用できます。

2 つの方法による SharePoint 列の検証

2 つの方法による SharePoint 列の検証

SharePoint 列の検証の数式を使用して、ユーザーからの入力を制限および検証する方法を学びます。

SharePoint リストを Excel または CSV ファイルにエクスポート

SharePoint リストを Excel または CSV ファイルにエクスポート

SharePoint リストを Excel ファイルおよび CSV ファイルにエクスポートする方法を学び、さまざまな状況に最適なエクスポート方法を決定できるようにします。

Power Automate のオンプレミス データ ゲートウェイ

Power Automate のオンプレミス データ ゲートウェイ

ユーザーがコンピューターから離れているときに、オンプレミス データ ゲートウェイを使用して Power Automate がデスクトップ アプリケーションにアクセスできるようにする方法を説明します。

DAX 数式での LASTNONBLANK の使用

DAX 数式での LASTNONBLANK の使用

DAX 数式で LASTNONBLANK 関数を使用して、データ分析の深い洞察を得る方法を学びます。

CROSSJOIN 関数の使用方法 – LuckyTemplates および DAX チュートリアル

CROSSJOIN 関数の使用方法 – LuckyTemplates および DAX チュートリアル

LuckyTemplates で予算分析とレポートを実行しながら、CROSSJOIN 関数を使用して 2 つのデータ テーブルをバインドする方法を学びます。

TREATAS 関数を使用して LuckyTemplates で仮想リレーションシップを作成する

TREATAS 関数を使用して LuckyTemplates で仮想リレーションシップを作成する

このチュートリアルでは、LuckyTemplates TREATAS を使用して数式内に仮想リレーションシップを作成する方法を説明します。