ブログ@nnaka2992

データベースってなんだよ

現在のDremelの実装を解説した論文を読みました

この記事の趣旨

2020年に発表されたBigQueryの元となったGoogle内で利用されている分析向けデータベースであるDremel の実装を解説した論文を読みました。

Dremel: A Decade of Interactive SQL Analysis at Web Scale

著者について

Sergey Melnik, Andrey Gubarev, Jing Jing Long, Geoffrey Romer, Shiva Shivakumar, Matt Tolton, Theo Vassilakisら2010年のDremel発表論文の著者らと、 Hossein Ahmadi, Dan Delorey, Slava Min, Mosha Pasumansky, Jeff ShuteらGoogleで分析ワークロードと 分散処理に関わる著者らによる論文。

概要

BigQueryの元となったGoogleのDremelの10年間を振り替えってアーキテクチャについて説明した論文。 Dremelは現代のクラウドネイティブ分析ツールで一般的になっている、計算リソースとストレージの 分解、カラムナストレージ、in situデータ分析などを統合した最初のツールである。

手法

  1. SQLの採用
    それまでGoogleでは殆どのデータはBigTableなどNoSQLデータベースで管理されていたため、 SQLを用いないデータアクセスが主流であった。 しかしトランザクションビッグデータシステムにおける、SQLの採用に共ないDremelでもSQLを採用した。

  2. ストレージの分離
    初期のDremelはシェアードナッシング方式を取っていたが、Borgへの移行にともない増大するクエリ負荷へ 対応するためにストレージをGFSへと切り出した。

  3. メモリの分離
    MapReduceのシャッフルのボトルネックを回避するためにDisaggregated Memory Shuffle Systemを採用した。

  4. In situデータ分析への対応
    In situデータ分析とはDBMSへのデータロードを必要としないデータ分析のことで、Dremelでは GFSに移行するときにGoogle内で共有のストレージフォーマットを使用することでGoogle内のデータに対応した。 加えてGoogle Cloud StorageやGoogle DriveMySQLBigTableなどからのデータ取得もフェデレーションとして 対応した。

  5. サーバレスアーキテクチャ
    分散、フォールトトレラントリスタート、仮想スケジューリングユニットによりマルチテナントかつオンデマンド なリソースを提供可能とし、低価格な利用を可能とした。 現在ではサーバレスアーキテクチャを進化させ、集中型スケジューリングやShuffle Persistent Layer、 柔軟なDAG実行、動的クエリ実行などを実装することでより優れたサーバレスアーキテクチャを実現した。

  6. ネストデータにおけるカラムナストレージ
    Dremelのデータフォーマットはprotobufのため半構造化データをカラムナストレージに保存する必要がある。 これはそれぞれのデータフィールドをそれぞれのカラムナストレージに保存することで実現している。

    [igure 5: Two sample nested records and their schema (based on Figure 2 in [32])]
    Figure 5
    Figure 6: Columnar representation of the data in Figure 5 showing repetition levels (r) and definition levels (d)
    Figure 6
    Figure 7: Columnar representation of the data in Figure 5 showing length (len) and presence (p
    Figure 7

  7. クエリレイテンシの最小化
    これまでに説明した手法を適用することでインタラクティブな実行のレイテンシは大きくなる。それを解決するために Dremelではスタンバイサーバプール、マルチレベル実行ツリー、列指向スキーマ表現、CPUとIO負荷のバランス調整、 ファイルオペレーションの再利用、保証されたキャパシティ、適合的なクエリスケーリングにより実現している。

作業時間

  • read
    • 27:50
    • 27:50
  • author
    • 32:02
    • 4:12
  • summary
    • 68:50
    • 26:48

クエリオプティマイザの精度を検証した論文を読みました

この記事の趣旨

2015年に発表されたクエリオプティマイザにおけるカーディナリティ推定とコストモデル、列挙アルゴリズムの貢献度を 評価した論文を読んでいきます。

How Good Are Query Optimizers, Really?

著者について

Viktor Leis、Andrey Gubichev、Atanas Mirchev、Peter Boncz、Alfons Kemper、Thomas Neumannらの グループによる論文。

ほとんどのメンバーはDBMSにおける最適化について研究しているが、Atanas Mirchevはより 統計や探索といった最適化よりの研究をしている。

問題意識

良い結合順序を見つけることはクエリの性能に対して大きな影響を与えるため、熱心に研究されてきた。 古典的なクエリ最適化のアプローチでは以下のステップで動的計画方に基づいた最適化を行なう。 1. 有効な結合順序の列挙 1. カーディナリティ推定値を入力としたコストモデルの選択

理論的にはカーディナリティとコストモデルの推定値が正確であれば、最適なクエリプランを選択することができる。 しかし現実にはカーディナリティ推定は一様性や独立性といった単純化された仮定に基づいており、しばしばそのような 仮定は間違っているため悲惨な計画を作成する。

手法

この論文ではカーディナリティ推定器の評価と正確なコストモデルの重要性の評価、そして列挙された結合順序の空間が どの程度影響するのかを以下の方法で検証し、貢献を行なっている。 1. IMDBデータを用いたJoin Order BenchmarkというJOINにフォーカスしたベンチマークによる評価を行なう 1. 実世界のデータセットにおける現実的なクエリを用いたE2Eの検証を行なう。 1. クエリ性能に対するカーディナリティ・コストモデル・列挙アルゴリズムの貢献度を定量化し、最適なクエリプラン生成のため のガイドラインを策定している。

作業時間

  • read
    • 29:38
    • 29:38
  • author
    • 33:08
    • 3:30
  • summary
    • 48:44
    • 14:36

感想

時間が無くまとめ途中で切り上げてしまった。やらないよりマシではあるものの、ちゃんと纏めるときに くらべて理解度に影響が出そうなので時間に余裕を持っておきたい。 内容自体はGW中にPostgreSQLの実装を読んでいたこともあり、わりと理解しやすかった。

現代のクエリオプティマイザの基礎となる技術をまとめた論文を読みました

この記事の趣旨

1998年に発表されたクエリオプティマイザの基礎としてとくに重要な手法をまとめた 論文を読みました。

An Overview of Query Optimization in Relational Systems

著者について

Surajit Chaudhuriによる論文 Microsoft所属の研究者でRDBMSの研究を行なっており、近年ではCloudにおけるDBMSの研究を行なっている。

概要

RDBMSが提案された1970年代からクエリ最適化は大規模で幅の広く研究が行なわれてきた。 この論文では執筆当時(1998年)までの重要な研究の基礎を説明している。

手法

  1. 探索空間
    一般化したJOINのプロセスを説明したのち、外部結合・グループバイによる結合・マージ処理による 結合対象のブロック化について説明している。

  2. 統計情報とコストの推定
    実行計画を決定する際に行なうコストの推定と、それに必要な統計情報について説明している。

  3. 列挙アルゴリズム
    クエリに対して高価ではない実行計画を提供するための、列挙アルゴリズムについて説明している。 論文内では拡張可能なオプティマイザとして、StarburstとVolcano/Cascadeの2種類のオプティマイザの詳細 を論じている。

  4. 最新(当時)の最適化
    当時最新であったトピックとして分散データベースと並列データベースの比較、UDFにおける最適化、そして マテリアライズドビューについて説明している。

作業時間

  • read
    • 31:40
    • 31:40
  • author
    • 33:40
    • 2:00
  • summary
    • 52:55
    • 19:15

感想

ベクトル化やパラレルジョインで扱われていたVolcanoオプティマイザの端に触れることが出来ました。 内容としては基礎的な内容が多いものの、知らない概念もいくつかあり引用している論文も読みたいです。 クエリ最適化の基礎を学ぶのに非常にいい内容でした。

DBMSとクライアント間におけるデータ転送を最適化する論文を読みました

この記事の趣旨

2017年に出版されたリモートDBMSとクライアント間の大量データ転送を最適化する 手法を提案する論文を読みました。

Don’t Hold My Data Hostage – A Case For Client Protocol Redesign

著者について

Mark Raasveldt、Hannes Muhleisenらのグループによる論文。 いずれもCentrum Wiskunde & Informaticaの所属で、DuckDBのCxO。 DBMSと分析システムにおけるパフォーマンス最適化を研究している。

問題意識

DBMSからクライアントプログラムに大量のデータを転送することは一般的なタスクである。 例えばRやPythonなどを用いた分析システムはしばしばデータベース・インターフェースを利用してデータの取得 を行なっている。

一方でネットワーク越しにデータを転送することはレイテンシを増加させ、転送時間を長引かせる要因である。 そのため分析用途で大量のデータ転送を避け、一部のデータをサンプルとして利用するに止まることが多い。 このアプローチはパフォーマンスの低下を押さえられるものの、分析や機械学習の精度を下げることに繋がる。

とくに既存のクライアントではネットワークによるレイテンシとスループットの制限に大きな影響を受けパフォーマンス を劣化させる。 この問題はデータベースが別マシンやクラウドで動作するときにより大きな問題となる。

手法

本論文では既存のシリアライズ手法と圧縮手法によるパフォーマンスへの影響を計測し、新しいプロトコルとして以下の特性を持つ 手法を提案している。 1. チャンク毎のデータ転送と(デ)シリアライゼーション 1. ヒューリスティックによる圧縮方法の決定 1. text/binaryによるカスタムシリアライゼーションを使用する 1. NULL終端によるテキストの取り扱い

実験結果

提案手法を実装したMonetDB(表内ではMonetDB++)とPostgreSQL(表内ではPostgreSQL++)を既存のDBMSやnetcatと比較することで 評価を行なっている。

TCP-Hのlineitem、American Community Survay、Airline On-Time Statisticsの3つのデータセットで評価を行なったところ、 ローカル通信における非圧縮netcatを除き殆どのケースでMonetDB++系が最良のパフォーマンスを発揮し 次点でPostgreSQL++系が優れた結果を残している。

Table 10: Results of transferring the SF10 lineitem table for different network configurations.
Table 10
Table 11: Results of transferring the ACS table for different network configurations.
Table 11
Table 12: Results of transferring the ontime table for different network configurations.
Table 12

PostgreSQLに比べMonetDBが優れている理由はPostgreSQLの行指向データを列指向に変換するコストのためである。

作業時間

  • read
    • 31:21
    • 31:21
  • author
    • 35:38
    • 4:17
  • summary
    • 70:13
    • 34:35

感想

論文出版時にはTPC/IPプロトコルが前提でQuic登場前のため、ネットワークプロトコル自体は考慮されていない。 現在であればTPC/IPとQuicに適合した手法の比較が行なわれると思うので気になるところ。

SQL ServerにおけるUDF最適化の論文を読みました

この記事の趣旨

2017年に発表されたSQL ServerでUDFを最適化しているFroidという手法についての論文を読みました。

Froid: Optimization of Imperative Programs in a Relational Database

著者について

Karthik Ramachandra、Kwanghyun Park、K. Venkatesh Emani、Alan Halverson、Cesar Galindo-Legaria、Conor Cunninghamの グループによる論文。 ほとんどの著者はMicrosoftに所属しており、いずれもトランザクショナルワークロードでの RDBMSの最適化や分析ワークロードにおけるRDBMS最適化の研究をしている。

問題意識

RDBMSではSQLによるデータ処理アプローチと、UDFやストアドプロシージャなどによる命令型のデータ処理アプローチを提供している。 SQLによるデータアクセスは高度に最適化されてきた一方で、命令型のデータ処理は非効率なため性能を阻害し利用を禁止している 組織すらある。

UDFによるデータアクセスは非効率であるものの、SQLに比べ下記のような利点を提供するため幅広く利用されているのも事実である。 1. SQL間でコードの再利用方法を提供する 1. 複雑なビジネスロジックやMLアルゴリズムなどSQLでは難しい表現を可能にする 1. 単純なSQLの組み合わせのため、ユーザーの意図が明確に表現できる

これらのメリットを享受するためにRDBMSにおける命令型データアクセス手法のパフォーマンスを向上しする必要があった。

手法

提案手法であるFroidはMicrosoft SQL Serverにおける命令型コードのパフォーマンス向上の手法として、 UDFを複雑なサブクエリとしてみなすアプローチを取っている。

UDFを構成する命令はDECLARESELECTIF/ELSERETURN他のUDFリレーショナルオペレーションの6つ に分ることができる。 提案手法ではこれらの命令を一般的なT-SQLに置き換え、Apply演算により一つの関係式に結合する方法で実現している。

Table 1: Relational algebraic expressions for imperative statements (using standard T-SQL notation)
Table 1

命令が一般SQLに置き換えられることでUDFに対して、SQLに用いられていた高度な最適化を導入することが出来る。

また提案手法ではい以下の理由から、SQLとして命令を置換するときにクエリ最適化時に行なうのではなく バインド時に置換をしている。 1. 実際のワークロードでの実験ではほぼ全てのケースでバインド時のほうが性能がよかった 1. クエリオプティマイザの変更が不要 1. バインディング時に特定の最適化を行なえる とくにクエリオプティマイザの変更はSQL Serverが商用データベースなため重要であった。

作業時間

  • read
    • 28:50
    • 28:50
  • author
    • 32:10
    • 3:20
  • summary
    • 57:00
    • 24:50

中間結果が莫大になるときの結合を最適化する最悪ケース最適化結合をRDBMSに適応する論文を読みました

この記事の趣旨

2018年に発表された分析ワークロードなどで発生しがちな最終結果に比べ、非常に大きな中間結果を 作成してしまうクエリを多方向結合で最適化する論文を読みました。

Adopting Worst-Case Optimal Joins in Relational Database Systems

著者について

Michael Freitag、Maximilian Bandle、Tobias Schmidt、Alfons Kemper、Thomas Neumannによるグループの論文 いずれの著者もDBMSにおける最適化を中心に研究しており、それぞれ分析ワークロードにおける最適化や 最新のハードウェアにおける最適化などを研究している。

問題意識

従来のRDBMSにおける結合処理のほとんどはバイナリ結合に依存して複数のリレーションにまたがるクエリを処理してきた。 数十年に渡る研究によりバイナリ結合は幅広い柔軟性と優れた性能を発揮するようになった。

その一方でバイナリ結合による実行計画は特定のワークロードでは最適ではないケースを示すことが知られている。 主な原因として実際のクエリ結果に比べて非常に大きな中間結果を生成するためである。 とくにPK以外のキーによる結合が多くなる分析ワークロードではそのような状態を避けることが難しく、 またグラフ分析のようなクエリパターンでも多く見られる。

近年の論理的な進歩により中間結果の列挙を避ける多方向結合のアルゴリズムが開発可能になった。 この手法はバイナリ結合計画より優れた実行時間を保証できるため、RDBMSの堅牢性を大幅に向上させる 可能性を持っている。

しかし現状最悪ケース最適化結合アルゴリズムでは以下のような問題を抱えている。 1. 膨大なストレージとメンテナンスを必要とする結合に参加出来るカラムを含むインデックスを必要とする。 1. RDBMSは挿入と更新のサポートが必要なものの、既存のアルゴリズムは高価な事前計算を必要とする。

そのため本論文は以下の制約を満たすアプローチを提案している 1. 多方向結合が有益な場合のみ多方向結合を使用するオプティマイザを必要とする。 1. 実行中に効率的に実行でき、ディスクのに永続化する必要のないパフォーマントインデックスを必要とする。

手法

提案手法では比較ベースではなくハッシュベースの結合のため、2の「実行中に効率的に実行でき、 ディスクのに永続化する必要のないパフォーマントインデックスを必要とする。」という要素の考慮を除いている。

またオプティマイザについては既存のコストベースのものを拡張し適応している。 提案手法では潜在的に成長している結合のカスケードを最悪の場合の最適結合に置き換えることで、 最適化されたバイナリ結合計画を洗練させるヒューリスティックなアプローチを提案している。

通常の結合順序最適化で使用されるのと同じカーディナリティ推定値に基づいて、中間テーブルが膨大になる結合を 特定する。

作業時間

  • read
    • 22:13
    • 22:13
  • author
    • 25:48
    • 3:35
  • summary
    • 52:58
    • 26:50

感想

とても難しい内容に感じてしまい、殆ど頭を通りすぎてしまった気がする。

今まで最適化は触れずに来たため、理解が浅い領域だった。よくよく考えるとDBMSの 話しに最適化が登場するのはあたりまえなので、今後はその方面にも触れて行きたい。

マルチコアメインメモリにおけるソートジョインとハッシュジョインのパフォーマンスを検証した論文を読みました

この記事の趣旨

2013年に発表された"Multi-Core, Main-Memory Joins: Sort vs. Hash Revisited"という論文を読みました。 当時最新のアルゴリズムとハードウェアにおける、ソートとハッシュによる結合のパフォーマンスを比べた論文です。

Multi-Core, Main-Memory Joins: Sort vs. Hash Revisited

著者について

Cagri Balkesen、Gustavo Alonso、Jens Teubner、M. Tamer Ozsuらのグループによる論文 いずれもDBMSにおけるクエリ最適化やビッグデータにおけるパフォーマンスを研究している。 またGustavo Alonsoはハードウェアや分散システムもメインのフィールドとしている。

問題意識

DBMSにおいて常にソートマージとハッシュ結合の性能比較が行われており、 最新の研究ではSIMDやNUMAへの適正に基づいてソートマージがより優れている と結論づけられていた。

しかしこれらの分野は常に研究が重ねられ、過去の検証時には登場していなったハッシュ結合の 最適化手法が生れた。

この論文ではそれらを適用し再度ソートマージとハッシュ結合の性能比較を行なう。

手法

本論文では以下に分けて結合手法の評価を行なっている。 1. ソートフェーズの評価
AVXを用いて実装したSIMDソートアルゴリズムC++STLソートアルゴリズムを比較している。

  1. マージフェーズの評価
    異なる入力サイズにおけるマージのパフォーマンスを検証している。

  2. 入力サイズの調整によるマージフェーズの最適化
    入力サイズとパーティショニングによるソートのパーマンスを検証している。

  3. ソートマージジョインにおける影響要因の特定
    ソートマージジョインにおける性能に影響を与える要因を特定し、あらたな最適化方法を 検討している。

結果

  • 結合対象のデータサイズに拘わらずハッシュによる結合がソートベースの結合のパフォーマンスを上回っている。

    Figure 14: Comparison of best sort vs. best hash join algorithms with cycles per output tuple metric under different workloads. Using 64 threads.
    Figure 14

  • ソートマージによる結合は入力サイズが著しく大きくなったときのみハッシュ結合のパフォーマンスに近づく。

    Figure 15: Sort vs. hash with increasing input table sizes (|R| = |S|). Throughput metric is total output tuples per second, i.e. |S|/execution time.
    Figure 15

  • ソートマージ、ハッシュ結合におけるデータの偏りはパフォーマンスに大きな影響を及ぼさなかった。

    Figure 16: Join performance when foreign key references follow a Zipfian distribution. Workload B.
    Figure 16

  • いずれのアルゴリズムも物理的なコア数では線形にスケールした。

    Figure 17: Scalability of sort vs. hash join. Throughput is in output tuples per second, i.e. |S|/execution time.
    Figure 17

作業時間

  • read
    • 23:11
    • 23:11
  • author
    • 27:09
    • 3:58
  • summary
    • 60:12
    • 32:57