メインコンテンツまでスキップ

データレイクQuery最適化

この文書は主にレイクデータ(Hive、Iceberg、Paimon等)のクエリ最適化手法と戦略について紹介します。

パーティション Pruning

クエリでパーティション列の条件を指定することで、不要なパーティションをプルーニングし、読み込む必要があるデータ量を削減できます。

EXPLAIN <SQL>を使用してXXX_SCAN_NODEpartitionセクションを確認し、パーティションプルーニングが効果的に機能しているか、また本クエリでスキャンする必要があるパーティション数を確認できます。

例:

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 DocumentationHDFS 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)

RequestBytesRequestIOは元のリクエストのデータ量とリクエスト数を示します。MergedBytesMergedIOはマージ後のデータ量とリクエスト数を示します。

MergedBytesRequestBytesよりもはるかに大きいことがわかった場合、深刻な読み取り増幅を示しています。以下のパラメータを通じて調整できます:

  • merge_io_read_slice_size_bytes

    セッション変数で、バージョン3.1.3以降でサポートされています。デフォルトは8MBです。深刻な読み取り増幅が見つかった場合、このパラメータを64KBなどに減らし、変更されたIOリクエストとクエリレイテンシが改善されるかどうか観察できます。