How to Architect a Query Compiler, Revisited
Citation
@inproceedings{10.1145/3183713.3196893,
author = {Tahboub, Ruby Y. and Essertel, Gr\'{e}gory M. and Rompf, Tiark},
title = {How to Architect a Query Compiler, Revisited},
year = {2018},
isbn = {9781450347037},
publisher = {Association for Computing Machinery},
address = {New York, NY, USA},
url = {https://doi.org/10.1145/3183713.3196893},
doi = {10.1145/3183713.3196893},
booktitle = {Proceedings of the 2018 International Conference on Management of Data},
pages = {307–322},
numpages = {16},
keywords = {query compilation, futamura projections},
location = {Houston, TX, USA},
series = {SIGMOD ’18}
}
どんなもの?
SQL コンパイラはどう作るのがいいの? → 二村射影の考え方をベースとしたメタプログラミングで作るといいよ
ということで、 LB2 というデータベースを作って、評価してみました。
先行研究と比べてどこがすごい?
- 先行研究として比較に挙げられていたもの: マルチパス
- SQL → 実行計画 → 中間表現その1 → 中間表現その2 → … → コンパイル
- この論文: シングルパス
- SQL → 実行計画 → コンパイル
マルチパスによって、実行計画に対する最適化がいろいろ行えるぞ!という主張があったが、シングルパスでも十分に最適化できるし、並列化においてはコーナーケースの検証が要らなくなるのでめっちゃ楽になる。
技術や手法のキモはどこ?
高級言語(ここでは Scala)で実装した、実行計画のインタプリタっぽいコードを使って、コンパイラを実装した。だから、インタプリタとコンパイラで複数の実装をメンテする必要がない。
(インタプリタっぽいコードを書くとコンパイラになる仕組みは、 LMS というライブラリで実現)
どうやって有効だと検証した?
先行研究として比較対象に挙げた DBLAB と HyPer と TPC-H ベンチマークで比較。 DBLAB は GLib のデータ構造に足を引っ張られたとかごたごた書いてあるけど、全体的にはちょっと速いか遜色ないくらい。
議論はある?
逆にどういうときにマルチパスのような構成にするべきなのか?という題の議論があり、 SQL とほかの言語を組み合わせるときなんかは使えるかもね、と書いてあった。複数の言語をまとめて二村射影のアプローチでがっとコンパイルする方法として最近 GraalVM/Truffle が出てきているので、 SQL とほかの言語のインターフェイスとして Truffle を使うと良いかもしれないと思った。
次に読むべき論文は?
比較対象
- DBLAB(抽象レベルの違う何段階かのDSLを用意した): How to Architect a Query Compiler
- HyPer(LLVMでごりごりコンパイラを書いた): Efficiently compiling efficient query plans for modern hardware
- PostgreSQL の JIT コンパイラも似たようなやり方になったの?: Runtime Specialization of PostgreSQL Query Executor
二村射影
GraalVM/Truffle
- One VM to Rule Them All (スライドは既読。論文は読んでない)