2025/10/08 15:01 Beyond Indexes: How Open Table Formats Optimize Query Performance

やあ、ロボ子!今日のITニュースはデータベースのインデックスについてじゃ。

博士、こんにちは。インデックスですか、興味深いですね。具体的にはどのような内容ですか?

SQLクエリで`SELECT * FROM Users WHERE LastName = ‘Martinez’`みたいなのがあったとするじゃろ?

はい、よくありますね。

ここでLastNameに対するセカンダリインデックスを使うんじゃ。B-treeで一致する行のクラスタ化キー(PK)を取得して、クラスタ化インデックス(テーブル自体)でPKを使って完全な行を取得するってわけ。

なるほど、セカンダリインデックスを使うことで、検索が効率化されるんですね。

そういうことじゃ!でもな、選択性が低い場合、つまりLastNameが’Martinez’の人がいっぱいいる場合は、フルテーブルスキャンの方が効率的な場合もあるんじゃぞ。

選択性が低いと、インデックスを使ってもあまり効果がないんですね。

その通り!セカンダリインデックスには利点も欠点もあるんじゃ。

利点と欠点、詳しく教えてください。

`SELECT Nationality FROM User WHERE Country = ‘Spain’`みたいなクエリは、セカンダリインデックスだけで処理できるんじゃ。さらに、カバリングカラムを追加すれば、クラスタ化インデックスへのアクセスを回避して、クエリを高速化できる。

カバリングインデックスは便利ですね。でも、欠点は何ですか?

書き込み時にセカンダリインデックスを同期的に更新する必要があるから、書き込みコストとメンテナンスコストが増加するんじゃ。それに、インデックスが断片化して、再構築が必要になることもある。

書き込みが多いシステムでは、セカンダリインデックスのコストが大きくなるんですね。

そういうこと!クエリオプティマイザは、テーブル統計(カーディナリティ、ヒストグラム)に基づいて、セカンダリインデックスを使うかどうか決めるんじゃ。

カーディナリティとヒストグラムですか。それらはどのように影響するんですか?

カーディナリティが高い場合(例えば、すべての行のCountryが’Spain’の場合)、セカンダリインデックスを使わない方が良いんじゃ。ヒストグラムは、カーディナリティが歪んでいる場合に役立つぞ。

なるほど、データの分布によって最適な戦略が変わるんですね。

RDBMSは、ポイントルックアップ、短い範囲、少数の行の結合、頻繁な書き込み/更新に最適化されてるんじゃ。テーブルは行ベースで、各ページに完全な行が格納されるから、単一行アクセスが効率的なんじゃ。

OLTPシステムに最適化されているんですね。

そういうことじゃ。オープンテーブル形式(OTF)は、分析システムで数百万または数十億の行をスキャンして集計または結合するのに使われるんじゃ。データは、大きな連続したブロックにカラム形式で格納される。

分析システムでは、カラム形式が効率的なんですね。

そう!セカンダリインデックスは、ファイルシステム上では非効率的であり、OTFがオブジェクトストレージでホストされている場合はさらに非効率的なんじゃ。IO削減は、テーブルスキャン中の効果的なデータスキップから得られる。

データスキップですか。どのように実現するんですか?

データスキップは、実行エンジンがスキャンする必要のあるファイルを決定するプランニングフェーズで発生し、プルーニングと呼ばれるんじゃ。テーブル構造自体(メタデータ+データファイル)が重要になるぞ。

Icebergテーブル形式もデータスキップをサポートしているんですね。

その通り!Icebergテーブル形式は、効率的なデータスキップを実現するための構成要素を提供するんじゃ。

今日はインデックスについて色々と学ぶことができました。ありがとうございます、博士。

どういたしまして、ロボ子。ところで、ロボ子がデータベースになったら、インデックスはどこに作るんじゃ?

えっと…頭の中ですか?

正解!でも、ロボ子の頭の中身はすでにインデックスだらけかもな!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
