## Memo 問題意識: - クエリの書き直しはクエリオプティマイザにクエリを渡す前に非効率なクエリを改善する重要な技術だが、手動での書き直しはスケールしない。 - 従来のクエリ書き換えアルゴリズムは対象となるクエリが限定的である。ルールベース手法は新しいクエリパターンに汎化できず、シンセシスベース手法は複雑なクエリを扱えない。 既存手法とその課題: - ルールベース手法は予め定義されたルールに基づくパターンマッチングで書き換えを行うため、未知のクエリパターンを最適化できない。 - シンセシスベース手法はルールを必要としないが、複雑なクエリを扱うのが難しい。 提案手法: - 大規模言語モデル(LLM)を活用したクエリ書き換えシステムGenRewriteを提案。 - 自然言語で書かれた書き換えルール(NLR2)を導入し、LLMへのヒントとしてだけでなくある書き換えで得た知識を他のクエリに転用する手段としても活用。 - 反例に基づく手法で、書き換えられたクエリの構文的・意味的エラーを反復的に修正することで、LLMのコストと検証に必要な手作業を大幅に削減。 - TPC-DSベンチマークの99クエリのうち22個で2倍以上の高速化を達成。これは従来手法の2.5〜3.2倍の適用範囲拡大を示す。 論文中で言及されているNLR2の具体例は以下の通りです。 - Pre-calculate aggregates in subqueries (サブクエリで集約を事前計算する) - Remove unnecessary UNION ALL operation (不要なUNION ALL操作を削除する) - Avoid using arithmetic operations in WHERE clause (WHERE句で算術演算を使用しない) - Replace implicit JOINs with explicit JOINs (暗黙のJOINを明示的なJOINに置き換える) - Remove unnecessary columns from the GROUP BY clause (GROUP BY句から不要な列を削除する) - Remove unnecessary table joins (不要なテーブル結合を削除する) - Use CTE (Common Table Expressions) to break down complex queries (複雑なクエリを分割するためにCTEを使用する) - Reduce the number of tables in the join operation (結合操作のテーブル数を減らす) - Aggregate before join (結合前に集約する) - Use subqueries to break down complex queries (複雑なクエリを分割するためにサブクエリを使用する) - Combine multiple queries into a single query (複数のクエリを1つのクエリに結合する) - Move WHERE clause filters to ON clause in JOINs (JOINのWHERE句のフィルターをON句に移動する) ## Abstract クエリの書き換えは、クエリオプティマイザにクエリを渡す前に、書き方が悪いクエリに対処するための最も効果的なテクニックの一つである。手作業による書き換えは、エラーが発生しやすく、深い専門知識を必要とするため、スケーラブルではありません。同様に、従来のクエリ書き換えアルゴリズムは、クエリの小さなサブセットしか扱うことができない。ルールベースのテクニックは新しいクエリパターンに汎化できず、合成ベースのテクニックは複雑なクエリを扱うことができない。幸いなことに、広範な一般知識と高度な推論能力を備えた大規模言語モデル(Large Language Models: [[LLM]])の台頭により、これまで未解決であった問題のいくつかを解決する希望が生まれている。 本論文では、LLMをクエリ書き換えに活用した初の総合的システムであるGenRewriteを紹介する。我々は自然言語書き換えルール(NLR2)の概念を導入し、LLMへのヒントとして、また、あるクエリを書き換えることから別のクエリへ知識を転送する手段として使用する。われわれは、新しい反例導出技法を提示し、書き換えられたクエリの構文的・意味的誤りを反復的に修正することで、LLMのコストと検証に必要な手作業を大幅に削減する。GenRewriteは99のTPCクエリ(最も複雑なパブリックベンチマーク)のうち22を2倍以上高速化し、これは最先端の伝統的なクエリ書き換えよりも2.5倍~3.2倍高いカバレッジであり、すぐに使えるLLMベースラインよりも2.1倍高い。