萌えハッカーニュースリーダー

2025/06/30 15:19 How often is the query plan optimal?

出典: https://vondra.me/posts/how-often-is-the-query-plan-optimal/
hakase
博士

ロボ子、今日のITニュースはクエリオプティマイザの話じゃぞ。最適なクエリプランを選ぶはずが、そうじゃないことって結構あるみたいじゃ。

roboko
ロボ子

クエリオプティマイザが間違うことがあるんですか?それは意外です。どうして最適なプランを選べないんでしょう?

hakase
博士

それがの、選択率の見積もりとコスト計算が原因らしいぞ。例えば、選択率が1〜5%くらいの時に、インデックススキャンを選ぶのが間違いだったりするんじゃ。

roboko
ロボ子

インデックススキャンが不適切な場合があるんですね。記事によると、単純なシーケンシャルスキャンの方が速い場合があると。

hakase
博士

そうそう。しかも、ビットマップスキャンの方がもっと良いことが多いらしい。インデックススキャンはプリフェッチをしないのが痛いみたいじゃな。

roboko
ロボ子

ビットマップスキャンはプリフェッチをするんですね。データセットの分布によっても変わってくるんですか?

hakase
博士

その通り!均一なデータセットだと見積もりは簡単だけど、データ局所性が低いから、linear, fuzz=10のデータセットだと、プランナーがインデックススキャンを選びがちで、ビットマップスキャンの方が良いのに、そうなってくれないみたいじゃ。

roboko
ロボ子

データ分布によって、最適なスキャン方法が変わるんですね。完全に線形のデータセットだと、一貫して正しいプランを選べるというのは興味深いです。

hakase
博士

完全に線形だと、カーネルの先読みが最適に働くから、手動プリフェッチのメリットがないらしいぞ。Ryzen 9900XとNVMe RAIDの環境でのテスト結果みたいじゃ。

roboko
ロボ子

ハードウェア環境によっても結果が変わるんですね。コールドキャッシュだと差が大きくなるというのも納得です。

hakase
博士

プランナーは統計とコストモデルを元に判断するけど、それが常に最良とは限らない。ユーザーはデータベースを信頼してるから、プランの違いに気づきにくいのが問題じゃな。

roboko
ロボ子

コストパラメータを調整することで改善できる可能性もあるんですね。でも、データセットの分布によっては逆効果になることもあると。

hakase
博士

そうなんじゃ。今回のテストは単純なクエリだったけど、複雑なクエリだとさらにややこしくなるぞ。テーブル結合とか、データの相関関係とか。

roboko
ロボ子

プランニングは高速化のために統計に頼る必要があるんですね。でも、統計はデータの簡略化された表現に過ぎないと。

hakase
博士

コストモデルもハードウェアの近似でしかないからの。オンプレミスならまだしも、クラウドだとさらに不正確になる。コストベースのプランニングには根本的な課題があるんじゃ。

roboko
ロボ子

統計やコストモデルを改善しても、常に欠落する詳細があるんですね。でも、コストベースのプランニングが最良のアプローチだと。

hakase
博士

そういうことじゃ。クエリプランが間違った時のために、調整方法を知っておくのが大事じゃな。ところでロボ子、クエリオプティマイザが風邪をひいたらどうなるか知ってるか?

roboko
ロボ子

え?どうなるんですか?

hakase
博士

SQLが止まる!…って、つまらんかったかの?

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search