トップ / 基礎知識

UDF・Vectorized UDF・UDTF・ストアドプロシージャの使い分け

Snowflake上でカスタムロジックを実行する4つの手段を、入出力の形とSQLからの呼び出し方で整理します。

スカラUDF:1行→1つの値

スカラUDFは行ごとに呼び出され、1つの値を返す関数です。SELECT句やWHERE句などのSQL式の中から直接呼び出せます。Python UDFの場合、1行ずつPythonの関数を呼び出すため、行数が多いとPythonの呼び出しオーバーヘッドが積み重なります。

Vectorized UDF:複数行をまとめて処理

Vectorized UDF(バッチUDF)は、複数行をPandasのDataFrameやSeriesとしてまとめて受け取り、まとめて結果を返す仕組みです。Snowflake公式ドキュメントは「Vectorized Python UDFは、入力行のバッチをPandas DataFrameとして受け取り、結果のバッチをPandas配列またはSeriesとして返すPython関数を定義できる」と説明しています。1行ずつPythonを呼び出すオーバーヘッドを避けられるため、機械学習の推論のようにバッチ処理に向く場面で特に有効です。

UDTF:1行(以上)の入力→複数行の出力

UDTF(ユーザー定義テーブル関数)は、入力に対して0行以上の複数行を出力できる関数です。公式ドキュメントによれば、UDTFのハンドラクラスは行ごとに呼び出されるprocessメソッドを実装し、そこでタプルとして表形式の値を返します。SQLのFROM句から呼び出す点がスカラUDFと異なります。

ストアドプロシージャ:制御フローそのものをパッケージ化

ストアドプロシージャ(SPROC)は、条件分岐・ループ・トランザクション管理・DDL/DMLの実行といった「処理の手順そのもの」をパッケージ化したものです。SQL式の中から呼び出すのではなく、CALL文で独立して実行します。UDF・UDTFにはできないDDL/DMLの実行が可能な点が大きな違いです。

使い分けの早見表

種類主な目的戻り値SQL式内から直接呼べるかDDL/DMLの実行
スカラUDF行ごとの計算・変換単一の値可能不可
Vectorized UDFバッチ単位の高速演算単一の値(バッチ処理)可能不可
UDTF表構造への展開・変換複数行・複数列可能(FROM句内)不可
ストアドプロシージャパイプライン制御・自動化任意不可(CALL文)可能

Polarsはローカルで動くライブラリなので、この4分類そのものが存在しません。Polarsで「カスタムロジック」というと、map_elementsのようなメソッドにPython関数を渡す形が中心で、SQLエンジン側にプッシュダウンして実行させるという概念がそもそもありません。

出典

公式ドキュメントの記載にもとづく解説です(実行検証はしていません)。確認日:2026-08-21