ブログ@nnaka2992

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

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