面倒な作業はすべて SQL に任せる: ユーザー定義関数

SQL ユーザー定義関数は、アプリケーションのパフォーマンスを最適化する 1 つの方法です。つまり、操作をアプリケーション レイヤーからデータベース レイヤーに移動します。

アプリケーション層を最適化する方法は数多くあります。 SQL データベース レイヤーを使用するアプリケーションの場合、場合によっては、実行できることを減らすことができます。 SQL データベースを操作する場合、ユーザー定義関数 (UDF) は「少ない」オプションです。 作業はまだ完了していますが、データベース層はより重いものに依存しており、アプリケーションのパフォーマンスを最適化するという最終結果をもたらします.

SQL UDF は、レイヤー間で行われる作業量を制限し、アプリケーション レイヤーを最適化できる SQL データベースで実行するために作成された関数です。 UDF は、意図的または意図せずにデータを変更できます。

SQL UDF とは

UDF は関数です。 また、SQL データベース ソフトウェアによって実行されることを除けば、他のすべてのプログラミング言語の関数と非常によく似ています。 それらの特徴は次のとおりです。

  • 関数呼び出しに必要な名前。
  • 関数が受け入れる引数、入力、およびそれらの型。
  • 出力/戻りステートメント。
  • 結果に到達するために引数に対して実行される操作を含む関数本体。

一部のデータベースの SQL UDF 作成関数は次のようになります。

  • CREATE FUNCTION add() は、add という名前の関数が作成されていることをデータベース ソフトウェアに知らせます。
  • a INT, b INT は、データベース ソフトウェアに、この関数の実行時に 2 つの引数 (どちらも整数) が必要であることを知らせます。
  • RETURNS INT は、整数が返されることをデータベース ソフトウェアに知らせます。
  • AS ‘SELECT a + b’ は、関数本体で実行されている操作です。

呼び出しは次のようになります。

8 は目標出力です。

ここで最適化が始まります。 UDF は、ビジネス ロジックをアプリケーション レイヤーからデータベースに移動します。これにより、アプリケーション レイヤーを最適化できますが、必要な操作を実行する必要はありません。 アプリケーション層の間を移動するデータの量と頻度を減らすことも、パフォーマンスを向上させるための鍵です。

そのSQLを考慮してください UDF add() は、データベースに存在する 2 つの値 (a = 3、b = 5) を使用してデータベースで呼び出され、1 つの値のみがアプリケーション層に返されます。8. UDF がなければ、2 つの値が返され、操作はアプリケーション層で行われます。 手順が増え、効率が低下します。

しかし、2 つの数値を加算して 1 つを返す関数はどの程度役立つのでしょうか? あまりない。 以下の関数は、CockroachDB ユーザーの Saquib Ali によって作成された UDF で、タイムスタンプ データを取得し、より人間に優しい「x 時間前」の形式に変換します。

副作用

他の関数と同様に、UDF は意図しない方法で SQL テーブルのデータを変更する可能性があります。 このため、一部のデータベースは、関数が他のデータに影響を与える範囲であるボラティリティに関する情報を提供するスペースを提供しています。

例:

IMMUTABLE は関数が他のデータを変更しないことを示し、LEAKPROOF は副作用がないことを意味します。

SQL で UDF を作成する方法

SQL システムごとに構文は異なりますが、Custer はさまざまなデータベース システム用のサンプル UDF をいくつか提供しています。

PostgreSQL:

mysql:

ゴキブリDB:

CockroachDB は Postgres ワイヤ プロトコルと互換性があるため、CockroachDB は PostgreSQL に似ています。

結論

これは、SQL UDF のトピックのほんの一部です。 アプリケーション層だけでなく、データベース層も最適化するために使用されます。 複雑さはここからかなり急上昇しますが、UDF に関する他の素晴らしい記事をいくつか紹介します。 Google と Microsoft にもいくつかの投稿 (Google BigQuery、Microsoft UDF) があり、それらには独自のデータベース システム向けの仕様も含まれています。

グループ スケッチで作成。

Leave a Comment

Your email address will not be published. Required fields are marked *