データセットプロジェクションは、大規模なクエリのパフォーマンスを向上できます。複数のクエリパターン向けにデータセットを最適化する場合(たとえば、2 列をフィルターするなど)、データセットにプロジェクションを追加することを考慮する必要があります。以下に、プロジェクションのユースケースの具体的な例を示しています。
各プロジェクションは通常、1 つのクエリパターンに対応し、列セットのフィルターまたは結合の向上に焦点を置いています。データセットには複数のプロジェクションを追加でき、プロジェクションではすべての列タイプが対応しています。また、プロジェクションはスナップショットにも、増分的にビルドしたデータセットにも追加できます。
プロジェクションには以下のような制限があります。
それぞれのユースケースにプロジェクションが適しているかどうかを確認するには、以下のユースケース例を確認してください。まず、プロジェクションの設定方法から確認してください。
プロジェクションは、多種多様なクエリタイプに有効です。以下にいくつかの例を挙げます。
順序を指定した列リストで、リストのいずれかのプレフィックスのフィルターを最適化します。プロジェクションは、列と定数値を比較するフィルターのみ高速化します。文字列のフィルターはすべて大文字と小文字を区別する必要があります。
たとえば、順序を指定した「["x", "y", "z"]」列のフィルターを最適化したプロジェクションは、 以下のタイプのクエリを高速化します。
SELECT * FROM dataset WHERE x = 5 AND y = 10 AND z = '15'
SELECT * FROM dataset WHERE x = 5 AND y = 10
SELECT * FROM dataset WHERE x = 5 AND q = 3
ただし、以下のタイプのクエリは最適化されません。
SELECT * FROM dataset WHERE abs(x) == 10
abs(x) == 10
は列を定数値と比較しません。SELECT * FROM dataset WHERE x % 100 == 10
x % 100 == 10
は列を定数値と比較しません。SELECT * FROM dataset WHERE y = 10
["y"]
は「["x", "y", "z"]」のプレフィックスではありません。SELECT * FROM dataset WHERE z = '15'
["z"]
は「["x", "y", "z"]」のプレフィックスではありません。プロジェクションは、以下の場合にフィルター列で範囲クエリを任意に高速化できます。
SELECT * FROM dataset WHERE x > 5 AND x < 10
SELECT * FROM dataset WHERE s LIKE 'SOME_PREFIX%'
順序を指定していない列セットとバケットカウントでは、適切なセットとバケットカウントで結合(のみ)を最適化します。
たとえば、{"x", "y"}
の結合に対して最適化されたプロジェクションは、以下のタイプのクエリを最適化します。
SELECT * FROM dataset1 INNER JOIN dataset2 ON dataset1.x = dataset2.x AND dataset1.y = dataset2.y
ただし、以下のクエリは最適化されません。
SELECT * FROM dataset1 INNER JOIN dataset2 ON dataset1.x = dataset2.x
Foundry では通常、大きなデータセットの結合にソートマージ結合を行います。この結合には、それぞれのデータセットをパーティションに分割することが含まれます。 パーティションへの分割は、結合キーに従って各パーティションをソートし、さらに同じキーを使って(ソートした)パーティションをマージすることで 行われます。
インクルメンタル(差分処理)パイプラインは、結果としてファイル数が非常に多くなる場合があり、読み取りパフォーマンスはこれに呼応して低下します。たとえば、5 分間に 10 パーティションを記述するパイプラインがあるとすると、1 年間に 100 万個以上のファイルを記述することになります。これらは、単に入力パーティションのリストが作成されるなど、さまざまな理由から読み取りが困難です。
プロジェクションには、これらの透過性など、インクルメンタル(差分処理)パイプラインを圧縮する方法が用意されています。フィルターと結合のいずれかに最適化したプロジェクションを設定し、読み取りでプロジェクションを使用します。プロジェクションを使用したインクルメンタル(差分処理)パイプラインの詳細はこちら
複数の CSV から構成され、クエリを行う必要がある(フロントエンドのインポートなどからの)データセットが あるとします。ビルドを設定し、最適化したフォーマット(Parquet など)に変換できます。プロジェクションの追加は、もう 1 つの オプションです。データセットには引き続き元の CSV ファイルが含まれますが、読み取りでは最適化プロジェクションが使用されます。