背景・目的
Z-Orderについて、あまり理解できてないので整理します。
まとめ
下記に特徴をまとめます。
| 特徴 | 説明 |
|---|---|
| Z-Order | 関連する情報を同じファイルセット内に共存させる手法 読み取る必要があるデータ量が削減される |
| 有効な場合 | カーディナリティが高い場合(カラムの一意な値の種類が多い場合) |
| 注意点 | 列が増えるごとにローカリティの効果は低下する データをスキップするには、min,max,countなどの列ローカルの統計が必要なため、統計が収集されてない列のZ-Orderは効果がない |
| 仕組み | space-filling curve (SFC)を使用する。空間充填曲線 |
| SFC | 多次元空間を一次元空間にマッピングする方法 |
概要
Z-Ordering関連する情報を同じファイル セット内に共存させる手法です。 Databricks のデータ スキッピング アルゴリズムは、この共局所性を自動的に使用します。この動作により、読み取る必要があるデータの量が削減されます。データをZ-Orderするには、 ZORDER BY句で順序付けする列を指定します。
- 関連する情報を同じファイルセット内に共存させる手法
- 読み取る必要があるデータ量が削減される
列がクエリ述語で一般的に使用されることが予想され、その列のカーディナリティが高い(つまり、多数の個別の値がある)場合は、ZORDER BYを使用します。
- クエリが頻繁に利用される
- カーディナリティが高い場合(カラムの一意な値の種類が多い場合)に、ZORDERを使用する
ZORDER BYにはカンマ区切りで複数の列を指定できます。しかし、列が増えるごとにローカリティの効果は低下します。統計が収集されていない列の Z-ordering は効果がなく、リソースの無駄遣いです。データをスキップするには、min、max、countといった列ローカルの統計が必要だからです。スキーマの列の順序を変更することで、特定の列に対する統計情報収集を設定したり、統計情報を収集する列の数を増やしたりすることができます。
- 列が増えるごとにローカリティの効果は低下する
- データをスキップするには、min,max,countなどの列ローカルの統計が必要なため、統計が収集されてない列のZ-Orderは効果がない
Z-order は、複数の列を同時にクエリするときにクエリパフォーマンスを向上させるソートされたデータセットを作成します。
- 複数列を同時にクエリする際に、クエリパフォーマンスを向上させるソートされたデータセットを作成する
A space-filling curve (SFC) is a way of mapping a multidimensional space into a one-dimensional space. It acts like a thread that passes through every cell element (or pixel) in the multidimensional space so that every cell is visited exactly once.
- 空間充填曲線(SFC)は、多次元空間を一次元空間にマッピングする方法
- SFCは、多次元空間内のすべてのセル要素(またはピクセル)を通過する糸のように機能し、すべてのセルを正確に一度だけ通過する
2次元を1次元に変換してみる
下記のパターンの入力値で考える。
| 入力1 | 入力2 | ビット1 | ビット2 | インターリーブ処理(ビット) | 最終結果(値) |
|---|---|---|---|---|---|
| 4 | 3 | 0100 | 0011 | 1010 1010 | 26 |
| 4 | 4 | 0100 | 0100 | 0011 0000 | 48 |
| 5 | 6 | 0101 | 0110 | 0011 1001 | 57 |
| 6 | 5 | 0110 | 0101 | 0011 0110 | 54 |
| 7 | 12 | 0111 | 1100 | 1011 0101 | 181 |
- (5,6)と(6,5)は近いが、(4,3)_と(4,4)は一見近そうだが、実際は遠くになる
考察
今回、Z-Orderについて調べてみました。頻繁に使用されるクエリ、カーディナリティが多い、2〜3程度のカラムの場合に有効と理解しました。
参考