データレイクQuery最適化
この文書は主にレイクデータ(Hive、Iceberg、Paimon等)のクエリ最適化手法と戦略について紹介します。
パーティション Pruning
クエリでパーティション列の条件を指定することで、不要なパーティションをプルーニングし、読み込む必要があるデータ量を削減できます。
EXPLAIN <SQL>を使用してXXX_SCAN_NODEのpartitionセクションを確認し、パーティションプルーニングが効果的に機能しているか、また本クエリでスキャンする必要があるパーティション数を確認できます。
例:
0:VPAIMON_SCAN_NODE(88)
table: paimon_ctl.db.table
predicates: (user_id[#4] = 431304818)
inputSplitNum=15775, totalFileSize=951754154566, scanRanges=15775
partition=203/0
ローカルデータキャッシュ
Data Cacheは、リモートストレージシステム(HDFSまたはオブジェクトストレージ)から最近アクセスされたデータファイルをローカルディスクにキャッシュすることで、同じデータにアクセスする後続のクエリを高速化します。
キャッシュ機能はデフォルトで無効になっています。設定および有効化については、Data Cacheのドキュメントを参照してください。
バージョン4.0.2以降、キャッシュウォームアップ機能がサポートされており、データキャッシュをより積極的に活用してクエリパフォーマンスを向上させることができます。
HDFS読み込み最適化
HDFS DocumentationのHDFS IO Optimizationセクションを参照してください。
Merge IO最適化
HDFSやオブジェクトストレージなどのリモートストレージシステムに対して、DorisはMerge IO技術を通じてIOアクセスを最適化します。Merge IO技術は、本質的に複数の隣接する小さなIOリクエストを1つの大きなIOリクエストにマージするもので、IOPSを削減し、IOスループットを向上させることができます。
例えば、元のリクエストがファイルfile1の[0, 10]と[20, 50]の部分を読み込む必要がある場合:
Request Range: [0, 10], [20, 50]
Merge IOを通じて、一つのリクエストにマージされます:
Request Range: [0, 50]
この例では、2つのIOリクエストが1つにマージされていますが、追加のデータ(10-20間のデータ)も読み取っています。そのため、Merge IOはIO操作の数を削減する一方で、潜在的な読み取り増幅の問題をもたらす可能性があります。
Query Profileを通じて具体的なMerge IO情報を確認できます:
- MergedSmallIO:
- MergedBytes: 3.00 GB
- MergedIO: 424
- RequestBytes: 2.50 GB
- RequestIO: 65.555K (65555)
RequestBytesとRequestIOは元のリクエストのデータ量とリクエスト数を示します。MergedBytesとMergedIOはマージ後のデータ量とリクエスト数を示します。
MergedBytesがRequestBytesよりもはるかに大きいことがわかった場合、深刻な読み取り増幅を示しています。以下のパラメータを通じて調整できます:
-
merge_io_read_slice_size_bytesセッション変数で、バージョン3.1.3以降でサポートされています。デフォルトは8MBです。深刻な読み取り増幅が見つかった場合、このパラメータを64KBなどに減らし、変更されたIOリクエストとクエリレイテンシが改善されるかどうか観察できます。