Postgresを分析用途で300倍高速化した手法
原題: Making Postgres 300x faster for analytics: batching, operator fusion, and SIMD
なぜ重要か
OLTPと分析系の両方でPostgresを大幅に上回る性能を示しており、PostgreSQL互換の次世代データベースエンジンとして注目される技術的な転換点を示す事例となる。
pgrust 0.2がリリースされ、分析系ベンチマーク「ClickBench」においてPostgresの300倍、OLTPベンチマークでも30%の高速化を達成した。クエリエンジンの改良だけで約10倍の性能向上を実現しており、ClickHouseをも上回る結果を示している。
pgrust 0.2がリリースされ、前バージョン比で10倍の高速化を達成した。ClickHouseが提供する分析系データベース向けベンチマーク「ClickBench」ではPostgresの300倍、OLTPベンチマークではPostgres比30%の高速化を記録した。さらにClickHouseと比較しても上回る結果となった。
今回の性能向上の中心は、クエリエンジンの再設計にある。クエリエンジン単体で300倍のうち約10倍の性能向上をもたらしており、主な最適化手法としてバッチ処理(batching)、オペレーター融合(operator fusion)、SIMD(Single Instruction Multiple Data)の活用が挙げられている。
Postgresは1980年代に設計されたシステムであり、当時の主要ボトルネックはディスクI/Oであった。しかし現代では、大規模データセットがRAMに収まるケースが増加し、NVMeの普及によりディスク自体も高速化されたことで、ボトルネックはCPUおよびメモリ帯域幅へと移行している。pgrustはこの変化に対応し、同一クエリ処理においてPostgresよりCPU使用量とメモリ帯域幅の消費を削減するよう最適化されている。
具体的な比較として、5億件の数値を合計する単純なクエリをPostgresで実行すると約20秒を要するが、同等処理をRustで記述した場合は358ミリ秒と約55倍の差が生じることが示されている(c8g.4xlインスタンス、並列クエリ無効の条件)。Postgresのオーバーヘッドの主な原因としては、ロック処理とPostgresストレージフォーマットの解析が挙げられている。pgrust 0.2では、こうした余分なオーバーヘッドを可能な限り排除するアーキテクチャを採用している。