ストレージ エンジン – 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 クエリを最適化するのに役立ちます。数式エンジンについて説明したチュートリアルも読んでいれば、よりパフォーマンスの高いクエリを作成する方法についてより適切な決定を下すことができます。

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

ではごきげんよう、


Python における Self とは: 実際の例

Python における Self とは: 実際の例

Python における Self とは: 実際の例

RでRDSファイルを保存してロードする方法

RでRDSファイルを保存してロードする方法

R の .rds ファイルからオブジェクトを保存および読み込む方法を学習します。このブログでは、R から LuckyTemplates にオブジェクトをインポートする方法についても説明します。

最初の N 営業日の再考 – DAX コーディング言語ソリューション

最初の N 営業日の再考 – DAX コーディング言語ソリューション

この DAX コーディング言語チュートリアルでは、GENERATE 関数の使用方法とメジャー タイトルを動的に変更する方法を学びます。

LuckyTemplates のマルチスレッド動的ビジュアル手法を使用したインサイトのショーケース

LuckyTemplates のマルチスレッド動的ビジュアル手法を使用したインサイトのショーケース

このチュートリアルでは、マルチスレッド動的ビジュアル手法を使用して、レポート内の動的データ視覚化から洞察を作成する方法について説明します。

LuckyTemplates のフィルター コンテキストの概要

LuckyTemplates のフィルター コンテキストの概要

この記事では、フィルター コンテキストについて説明します。フィルター コンテキストは、LuckyTemplates ユーザーが最初に学習する必要がある主要なトピックの 1 つです。

LuckyTemplates Online Service でアプリを使用する際の最良のヒント

LuckyTemplates Online Service でアプリを使用する際の最良のヒント

LuckyTemplates Apps オンライン サービスが、さまざまなソースから生成されたさまざまなレポートや分析情報の管理にどのように役立つかを示したいと思います。

時間の経過に伴う利益率の変化を分析する – LuckyTemplates と DAX を使用した分析

時間の経過に伴う利益率の変化を分析する – LuckyTemplates と DAX を使用した分析

LuckyTemplates でのメジャー分岐や DAX 数式の結合などの手法を使用して、利益率の変化を計算する方法を学びます。

DAX Studio でのデータ キャッシュのマテリアライゼーションのアイデア

DAX Studio でのデータ キャッシュのマテリアライゼーションのアイデア

このチュートリアルでは、データ キャッシュの具体化のアイデアと、それが結果を提供する際の DAX のパフォーマンスにどのように影響するかについて説明します。

LuckyTemplates を使用したビジネス レポート

LuckyTemplates を使用したビジネス レポート

これまで Excel を使用している場合は、ビジネス レポートのニーズに合わせて LuckyTemplates の使用を開始するのに最適な時期です。

LuckyTemplates ゲートウェイとは何ですか? 知っておくべきことすべて

LuckyTemplates ゲートウェイとは何ですか? 知っておくべきことすべて

LuckyTemplates ゲートウェイとは何ですか? 知っておくべきことすべて