機械学習*1の手法を使ってPostgreSQLのモニタリングとパフォーマンス向上を目指す目的で開発していた pg_plan_inspectorというフレームワークを公開した。
とりあえず動画を。
この動画は、クエリの進捗を推測して表示するモジュールのデモ動画である。
詳細はREADMEを参照。
開発動機
このフレームワークの開発動機は以下の2つ:
- (純粋な外部モジュールだけで、つまりPostgreSQL本体を改造することなく)リアルタイムでクエリの実行状況をモニタリングする。
- 常に捨てられているクエリの実行計画を使って、クエリプランの改善を行う。
現在のステータス
このフレームワークはまだ開発が始まったばかりで、POC(Proof Of Concept)モデルである。
現時点で開発動機の1.については達成できた。
開発動機の2.については、簡単なツールでテーブルの属性間の関数依存性を抽出し、拡張統計(Extended Statistics)を設定すべき候補をリストアップすることができることを示した。詳細はREADME-tools参照。
今後について
今後について、現時点では2段階の開発プランを持っている。
Step 1
現時点でクエリの進捗を推測するために、線形回帰モデルでOptimizerの推定したPlan Rowsを補正している。 逆の見方をすれば、Optimizerが推定する際に補正してもよいはずである。
実際、同様のアイディアは(アプローチや実装方法は異なるが)pg_plan_advsrが既に実現している。
よってStep 1では、回帰モデルで得たパラメータをPostgreSQL側に渡し、Optimizerの推定値を補正する機能を実現する。
それから、今はアドホックな手法で関数依存性を抽出しているが、そのアルゴリズムも改良する予定。
Step 2
これまでの実装の過程で、線形回帰モデルによる補正はNested Loopには比較的有効であることがわかったが、 Hash JoinやMerge Joinでは補正が難しい場合が多いこともわかっている。 また、テーブルの属性間に関数依存性があるとPostgreSQLのoptimizerは不正確なPlan Rowsを推定してしまい、線形回帰モデルでは補正できない状況になることも多い。
これらの問題に、近年ではAI(もしくは広く機械学習)の手法を使ってアプローチする論文やプロトタイプが数多く発表されている。 詳細はリファレンスの[6]や[7]などを参照のこと。
リファレンスに示したシステムのうち、いくつかはgithubでソースコードが公開されているので、使えるものは取り込んでしまおうと思っている。
またこれらは研究が目的であるため、純粋に正確なCardinality Estimationを得るアルゴリズムの開発を主眼としているようだが、 こちらは開発者なのでうまく動けばどのアルゴリズムでもよいし、実行後の結果を(教師データとして)フィードバックして学習をブーストすることも可能ではないかと目論んでいる。ま、この辺りは確証もない単なる思いつきである。