先月、
PostgreSQLアンカンファレンスで「PL/Pythonで独自の集約関数を作ってみる」という発表をしました。
本エントリでは、その詳細について紹介させていただきます。
■なぜPL/Pythonで集約関数なのか?
既に広く知られている通り、PostgreSQLではさまざまなプログラミング言語でプロシージャ/ファンクションをユーザが定義することができます。
では、なぜPL/Pythonで集約関数なのでしょうか?
まず1つ目の理由としては、Pythonとデータ処理が非常に相性が良い、ということが挙げられます。古くから統計解析でRが使われてエコシステムが発展してきたのと同じように、最近ではPythonを取り巻くデータ分析に関するエコシステムが大きくなり、データ分析に関するさまざまな処理をPythonで行えるようになってきています。
2つ目の理由としては、データ処理と集約関数というのは切っても切れない関係にあるということです。シンプルな COUNT() や AVG() から、最近ではウィンドウ関数まで、集約関数にはさまざまな処理があり、データベースにおけるデータ分析に集約関数は欠かせません。
そして、最後の理由としては、集約関数は「インデータベース(In-Database)処理」である、ということです。「インデータベース処理」というのは、データベースからデータを取り出してクライアントサイドで処理させるのではなく、データベースの内部でデータ処理をさせることを言います。こうすることによって、データの転送にかかる時間を削減したり、よりスペックの高いサーバ側で大量の処理をさせることが可能になります。
これらの理由から、これからPL/Pythonを使って独自の集約関数を作成できる意義はより高まっていくでしょう。
■PostgreSQLにおける集約関数の構造
次に、PostgreSQLの集約関数の構造を見てみましょう。
以下は、基本的なPostgreSQLの集約関数の構造および動作です。