すべてのプロダクト
Search
ドキュメントセンター

PolarDB:AGGREGATEの作成

最終更新日:May 30, 2024

CREATE AGGREGATEは、新しい集計関数を定義します。

説明

CREATE AGGREGATEは、新しい集計関数を定義します。 CREATE OR REPLACE AGGREGATEは、新しい集計関数を定義するか、既存の定義を置き換えます。 新しい型を定義したり、まだ提供されていない集約関数が必要な場合は、CREATE aggregateを使用して目的の機能を提供できます。

既存の定義を置き換えるとき、引数の型、結果の型、および直接引数の数は変更できません。 また、新しい定義は、古い定義と同じ種類 (通常の集計、順序集合集計、または仮想集合集計) でなければなりません。

スキーマ名が指定されている場合 (たとえば、CREATE AGGREGATE myschema.myagg ...) 、指定されたスキーマに集計関数が作成されます。 指定されない場合は、現在のスキーマに作成されます。

集合関数は、その名前および入力データ型によって識別される。 同じスキーマ内の2つの集計は、異なる入力タイプで動作する場合、同じ名前を持つことができます。 また、アグリゲートの名前と入力データ型は、同じスキーマ内のすべての通常の関数の名前と入力データ型とは異なる必要があります。 この動作は、通常の関数名のオーバーロードと同じです。

単純な集約関数は、状態遷移関数sfuncとオプションの最終計算関数ffuncの1つまたは2つの通常の関数から作成されます。 これらは次のように使用されます。

sfunc( internal-state, next-data-values ) ---> next-internal-state
    ffunc (内部状態) ---> 集計値 

PolarDBは、集計の現在の内部状態を保持するために、データ型stypeの一時変数を作成します。 各入力行において、集合引数値が計算され、状態遷移関数が、新しい内部状態値を計算するために、現在の状態値および新しい引数値を用いて呼び出される。 すべての行が処理された後、最後の関数が一度呼び出され、集計の戻り値が計算されます。 最終関数が存在しない場合、終了状態値がそのまま返される。

集合関数は、初期条件、すなわち内部状態値の初期値を提供することができる。 これはtext型の値として指定され、データベースに格納されますが、状態値データ型の定数の有効な外部表現である必要があります。 それが供給されない場合、状態値はヌルから始まる。

状態遷移関数が「strict」と宣言されている場合、null入力で呼び出すことはできません。 このような遷移関数では、集計実行は次のように動作します。 入力値がnullである行は無視されます (関数は呼び出されず、前の状態値は保持されます) 。 初期状態値がnullの場合、すべてがnullでない入力値を持つ最初の行で、最初の引数値が状態値を置き換え、遷移関数がすべてがnullでない入力値を持つ後続の各行で呼び出されます。 これは、maxなどの集計を実装するのに便利です。 この動作は、state_data_typeが最初のarg_data_typeと同じ場合にのみ使用できることに注意してください。 これらの型が異なる場合は、null以外の初期条件を指定するか、厳密でないトランジション関数を使用する必要があります。

状態遷移関数が厳密でない場合、それは各入力行で無条件に呼び出され、それ自体についてヌル入力およびヌル状態値を扱わなければならない。 これにより、集計の作成者は、集計のnull値の処理を完全に制御できます。

final関数が "strict" と宣言されている場合、終了状態値がnullのときに呼び出されません。代わりに、null結果が自動的に返されます。 (もちろん、これは厳密な関数の通常の動作です。) いずれの場合も、最後の関数にはnull値を返すオプションがあります。 たとえば、avgの最後の関数は、入力行がゼロであることがわかるとnullを返します。

最後の関数を、状態値だけでなく、集計の入力値に対応する追加のパラメーターとして宣言すると便利な場合があります。 これを行う主な理由は、最終関数がポリモーフィックであり、状態値のデータ型が結果型をピンダウンするには不十分な場合です。 これらの余分なパラメーターは常にNULLとして渡されます (したがって、FINALFUNC_extraオプションが使用されている場合、最終関数は厳密ではありません) が、それでも有効なパラメーターです。 最後の関数は、たとえば、get_fn_expr_argtypeを使用して、現在の呼び出しの実際の引数型を識別することができます。

これには、MSFUNCMINVFUNC、およびMSTYPEパラメーター、およびオプションでMSSPACEMFINALFUNCMFINALFUNC EXTRAMFINALFUNC_MODIFY、およびMINITCONDパラメーターを指定する必要があります。 MINVFUNCを除いて、これらのパラメータは、Mのない対応する単純集計パラメータと同様に機能します。これらは、逆遷移関数を含む集計の個別の実装を定義します。

パラメーターリストにORDER BYの構文は、順序集合集合と呼ばれる特別なタイプの集合体を作成します。または、HYPOTHETICALが指定されている場合は、仮想集合集合が作成されます。 これらの集計は、順序に依存する方法でソートされた値のグループに対して動作するため、入力ソート順序の指定は呼び出しの重要な部分です。 また、直接引数を持つこともできます。これは、入力行ごとに1回ではなく、集計ごとに1回だけ評価される引数です。 仮想集合集合体は、順序集合集合体のサブクラスであり、直接引数のいくつかは、数およびデータ型において、集合された引数列と一致する必要がある。 これにより、これらの直接引数の値を、追加の「仮想」行として集計入力行のコレクションに追加できます。

アグリゲートは、オプションで部分的アグリゲーションをサポートできます。 これには、COMBINEFUNCパラメーターを指定する必要があります。 state_data_typeinternalの場合は、通常、SERIALFUNCおよびDESERIALFUNCパラメーターを指定して、並列集計を可能にすることも適切です。 並列アグリゲーションを有効にするには、アグリゲートもPARALLEL SAFEとマークする必要があります。

MINまたはMAXのように動作する集合体は、入力行ごとにスキャンする代わりにインデックスを調べることによって最適化できる場合があります。 この集計を最適化できる場合は、ソート演算子を指定して指定します。 基本的な要件は、集計が演算子によって引き起こされるソート順序で最初の要素を生成する必要があることです。

SELECT agg(col) FROMタブ;

以下と同等である必要があります。

SELECT col FROMタブ注文BY col使用sortop LIMIT 1;

さらなる仮定は、集合体がヌル入力を無視し、非ヌル入力が存在しない場合にのみヌル結果を供給することである。 通常、データ型の < 演算子はMINの適切なソート演算子であり、>MAXの適切なソート演算子です。 最適化は、指定された演算子がBツリーインデックス演算子クラスの「より小さい」または「より大きい」戦略メンバーでない限り、実際には有効にならないことに留意されたい。

集計関数を作成するには、引数型、状態型、および戻り値型に対するUSAGE権限と、サポートする関数に対するEXECUTE権限が必要です。

概要

CREATE [ OR REPLACE ] AGGREGATE name ( [ argmode ] [ argname ] arg_data_type [ , ... ] ) (
        SFUNC = sfunc、
        STYPE = state_data_type
        [ , SSPACE = state_data_size]
        [ , FINALFUNC = ffunc]
        [ , FINALFUNC_EXTRA]
        [ , FINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]
        [ , COMBINEFUNC = combinefunc]
        [ , SERIALFUNC = serialfunc]
        [ , DESERIALFUNC = deserialfunc]
        [ , INITCOND = initial_condition]
        [ , MSFUNC = msfunc]
        [ , MINVFUNC = minvfunc]
        [ , MSTYPE = mstate_data_type]
        [ , MSSPACE = mstate_data_size]
        [ , MFINALFUNC = mffunc]
        [ , MFINALFUNC_EXTRA]
        [ , MINITCOND = minitial_condition]
        [ , SORTOP = sort_operator]
        [ , PARALLEL = {安全 | 制限付き | 安全ではない}]
    )

    CREATE [ OR REPLACE ] AGGREGATE name ( [ [ argmode ] [ argname ] arg_data_type [ , ... ] ]]
                            ORDER BY [ argmode ] [ argname ] arg_data_type [ , ... ] ) (
        SFUNC = sfunc、
        STYPE = state_data_type
        [ , SSPACE = state_data_size]
        [ , FINALFUNC = ffunc]
        [ , FINALFUNC_EXTRA]
        [ , FINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]
        [ , INITCOND = initial_condition]
        [, 仮説]
        [ , PARALLEL = {安全 | 制限付き | 安全ではない}]
    )

    または古い構文

    CREATE [ OR REPLACE ] AGGREGATE名 (
        BASETYPE = base_type,
        SFUNC = sfunc、
        STYPE = state_data_type
        [ , SSPACE = state_data_size]
        [ , FINALFUNC = ffunc]
        [ , FINALFUNC_EXTRA]
        [ , FINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]
        [ , COMBINEFUNC = combinefunc]
        [ , SERIALFUNC = serialfunc]
        [ , DESERIALFUNC = deserialfunc]
        [ , INITCOND = initial_condition]
        [ , MSFUNC = msfunc]
        [ , MINVFUNC = minvfunc]
        [ , MSTYPE = mstate_data_type]
        [ , MSSPACE = mstate_data_size]
        [ , MFINALFUNC = mffunc]
        [ , MFINALFUNC_EXTRA]
        [ , MFINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]
        [ , MINITCOND = minitial_condition]
        [ , SORTOP = sort_operator]
    )

パラメーター

name: 作成する集計関数の名前 (スキーマ修飾) 。

argmode: 引数のモード: INまたはVARIADIC。 (集計関数はOUT引数をサポートしません。) 省略した場合、デフォルトはINです。 最後の引数のみVARIADICとマークできます。

argname: 引数の名前。 これは現在、文書化の目的でのみ役立ちます。 省略した場合、引数には名前がありません。

arg_data_type: この集計関数が動作する入力データ型。 ゼロ引数集計関数を作成するには、引数仕様のリストの代わりに * を記述します。 (そのような集計の例はcount(*) である。)

base_type: CREATE AGGREGATEの古い構文では、入力データ型は集計名の横に記述されるのではなく、basetypeパラメーターで指定されます。 この構文では、入力パラメーターは1つだけです。 この構文でゼロ引数の集計関数を定義するには、basetype"ANY" (* ではない) として指定します。 順序集合集計は、古い構文では定義できません。

sfunc: 入力行ごとに呼び出される状態遷移関数の名前。 通常のN引数の集計関数の場合、sfuncN + 1引数を取る必要があります。最初の引数はstate_data_type型で、残りの引数は集計の宣言された入力データ型と一致します。 関数は、state_data_type型の値を返す必要があります。 この関数は、現在の状態値と現在の入力データ値を受け取り、次の状態値を返します。

オーダードセット (仮想セットを含む) アグリゲートの場合、状態遷移関数は、直接引数ではなく、現在の状態値とアグリゲートされた引数のみを受け取ります。 それ以外は同じです。

state_data_type: 集計の状態値のデータ型。

state_data_size: 集計の状態値のおおよその平均サイズ (バイト単位) 。 このパラメーターが省略またはゼロの場合、state_data_typeに基づいてデフォルトの推定値が使用されます。 プランナーはこの値を使用して、グループ化された集計クエリに必要なメモリを推定します。

ffunc: すべての入力行がトラバースされた後に集計結果を計算するために呼び出される最終関数の名前。 通常の集計では、この関数はstate_data_type型の単一の引数を取る必要があります。 集計の戻りデータ型は、この関数の戻り値の型として定義されます。 ffuncが指定されていない場合、終了状態の値が集計の結果として使用され、戻り値の型はstate_data_typeになります。

順序集合 (仮想集合を含む) 集合体の場合、final関数は最終状態値だけでなく、すべての直接引数の値も受け取ります。

FINALFUNC_EXTRAが指定されている場合、最終状態値および任意の直接引数に加えて、最終関数は、集合体の通常の (集約された) 引数に対応する追加のNULL値を受け取る。 これは主に、多型アグリゲートが定義されているときにアグリゲート結果タイプの正しい解決を可能にするのに役立ちます。

FINALFUNC_MODIFY= {READ_ONLY | SHAREABLE | READ_WRITE }: このオプションは、最後の関数が引数を変更しない純粋な関数であるかどうかを指定します。 READ_ONLYは、そうでないことを示し、他の2つの値は、遷移状態値を変更し得ることを示す。 既定値はREAD_ONLYです。ただし、順序付き集合体の場合、既定値はREAD_WRITEです。

combinefunc: combinefunc関数は、任意選択で、集合関数が部分集合をサポートできるように指定することができる。 指定されている場合、combinefuncは、2つのstate_data_type値を組み合わせて、入力値の一部の集合に対する集計結果を表す新しいstate_data_typeを生成する必要があります。 この関数は、sfuncと考えることができ、個々の入力行に作用して実行中の集約状態に追加する代わりに、別の集約状態を実行中の状態に追加します。

combinefuncは、state_data_typeの2つの引数を受け取り、state_data_typeの値を返すものとして宣言する必要があります。 オプションとして、この関数は「厳密」であってもよい。 この場合、関数は、入力状態のいずれかがヌルであるときには呼び出されず、他方の状態が正しい結果として取られる。

state_data_typeinternalである集計関数の場合、combinefuncは厳密ではありません。 この場合、combinefuncは、null状態が正しく処理され、返される状態が集計メモリコンテキストに適切に格納されることを保証する必要があります。

serialfunc: state_data_typeinternalである集計関数は、serialfunc関数がある場合にのみ、並列集計に参加できます。 この関数は、型internalの単一の引数を取り、型byteaを返す必要があります。 対応するdeserialfuncも必要です。

deserialfunc: 以前にシリアル化された集計状態をstate_data_typeに逆シリアル化します。 この関数は、bytea型とinternal型の2つの引数を取り、internal型の結果を生成する必要があります。 (注: 2番目の内部引数は使用されていませんが、型の安全上の理由から必要です。)

initial_condition: 状態値の初期設定。 これは、データ型state_data_typeに対して受け入れられる形式の文字列定数である必要があります。 指定しない場合、状態値はnullから始まります。

msfunc: 移動集約モードで入力行ごとに呼び出されるフォワード状態遷移関数の名前。 これは通常のtransition関数とまったく同じですが、最初の引数と結果がmstate_data_type型で、state_data_typeとは異なる場合があります。

minvfunc: 移動集約モードで使用される逆状態遷移関数の名前。 この関数の引数と結果の型はmsfuncと同じですが、値を追加するのではなく、現在の集計状態から値を削除するために使用されます。 逆遷移関数は、順状態遷移関数と同じ厳密性属性を持たなければならない。

mstate_data_type: 移動集計モードを使用している場合の集計の状態値のデータ型です。

mstate_data_size: 移動集計モードを使用している場合の集計の状態値のおおよその平均サイズ (バイト単位) 。 これはstate_data_sizeと同じように機能します。

mffunc: 移動集計モードを使用するときに、すべての入力行がトラバースされた後に集計結果を計算するために呼び出される最終関数の名前。 これはffuncと同じように機能しますが、最初の引数の型がmstate_data_typeであり、追加のダミー引数がMFINALFUNC_extraを記述することで指定されます。 mffuncまたはmstate_data_typeによって決定される集計結果タイプは、集計の通常の実装によって決定されるものと一致する必要があります。

MFINALFUNC_MODIFY= {READ_ONLY | SHAREABLE | READ_WRITE }: このオプションはFINALFUNC_MODIFYに似ていますが、移動集合最終関数の動作を記述します。

minitial_condition: 移動集約モードを使用する場合の状態値の初期設定。 これはinitial_conditionと同じように機能します。

sort_operator: MINまたはMAXのような集計に関連付けられたソート演算子。 これは単なる演算子名です (おそらくスキーマ修飾) 。 演算子は、集計と同じ入力データ型を持つと想定されます (これは単一引数の通常の集計である必要があります) 。

PARALLEL ={SAFE | RESTRICTED | UNSAFE }: PARALLEL SAFEPARALLEL RESTRICTEDPARALLEL UNSAFEの意味は、CREATE FUNCTIONと同じです。 アグリゲートは、PARALLEL UNSAFE (デフォルト) またはPARALLEL RESTRICTEDとマークされている場合、並列化の対象とは見なされません。 集合体のサポート機能の並列安全マーキングは、プランナーによっては参照されず、集合体自体のマーキングのみが参照されることに留意されたい。

HYPOTHETICAL: 順序付けられた集合体のみの場合、このフラグは、集合体引数が仮説集合体の要件に従って処理されることを指定します。つまり、最後のいくつかの直接引数は、集合体 (WITHIN GROUP) 引数のデータ型と一致する必要があります。 HYPOTHETICALフラグは、実行時の動作には影響せず、データ型の解析時の解決と集計の引数の照合にのみ影響します。

CREATE AGGREGATEのパラメーターは、上記の順序だけでなく、任意の順序で記述できます。

サポート関数名を指定するパラメーターでは、必要に応じてSFUNC = public.sumなどのスキーマ名を記述できます。 ただし、そこに引数型を記述しないでください。サポート関数の引数型は他のパラメーターから決定されます。

通常、PostgreSQL関数は、入力値を変更しない真の関数であると予想されます。 ただし、集計遷移関数は、集計のコンテキストで使用される場合、その遷移状態引数を不正に操作して変更することができます。 これは、毎回遷移状態の新しいコピーを作成することと比較して、実質的な性能上の利点を提供できる。

同様に、集合最終関数は、通常、その入力値を変更しないことが期待されるが、遷移状態引数を変更することを回避することは非現実的な場合がある。 このような動作は、FINALFUNC_MODIFYパラメーターを使用して宣言する必要があります。 READ_WRITE値は、final関数が遷移状態を不特定の方法で変更することを示します。 この値は、集計をウィンドウ関数として使用することを防ぎ、同じ入力値と遷移関数を共有する集計呼び出しの遷移状態のマージも防ぎます。 SHAREABLE値は、最終関数の後に遷移関数を適用できないことを示しますが、終了遷移状態値に対して複数の最終関数呼び出しを実行できます。 この値は、ウィンドウ関数としての集計の使用を妨げるが、遷移状態のマージを可能にする。 (すなわち、ここで注目する最適化は、同じ最終関数を繰り返し適用するのではなく、同じ終了遷移状態値に対して異なる最終関数を適用することである。 これは、最終関数のいずれもREAD_WRITEとマークされていない限り許可されます。

集合体が移動 − 集合体モードをサポートする場合、集合体が、移動フレーム開始 (すなわち、UNBOUNDED PRECEDING以外のフレーム開始モード) を有するウィンドウのためのウィンドウ関数として使用されるとき、計算効率を改善する。 概念的には、順方向遷移関数は、入力値が下からウィンドウフレームに入るときに集合の状態に入力値を追加し、逆遷移関数は、入力値が上からフレームを離れるときにそれらを再び除去する。 したがって、値が削除されると、値は常に追加されたのと同じ順序で削除されます。 したがって、逆遷移関数が呼び出されるときはいつでも、それは、最も早く追加されたがまだ削除されていない引数値を受け取る。 逆遷移関数は、最も古い行を除去した後、少なくとも1つの行が現在の状態に留まると仮定することができる。 (そうでない場合、ウィンドウ関数メカニズムは、逆遷移関数を使用するのではなく、単に新しい集約を開始する。)

移動集約モードの順方向遷移関数は、新しい状態値としてNULLを返すことはできません。 逆遷移関数がNULLを返す場合、これは、逆関数がこの特定の入力に対する状態計算を逆にすることができないことを示すものと見なされ、したがって、集約計算は、現在のフレーム開始位置に対して最初から再実行される。 この規則により、移動 − 集合モードは、実行状態値から反転することが非現実的であるいくつかのまれなケースが存在する状況で使用されることが可能になる。

移動集計の実装が提供されていない場合でも、移動フレームで集計を使用できますが、フレームの開始が移動するたびにPolarDBが集計全体を再計算します。 アグリゲートがムービングアグリゲートモードをサポートしているかどうかにかかわらず、PolarDBは再計算なしでムービングフレームエンドを処理できます。これは、アグリゲートの状態に新しい値を追加し続けることによって行われます。 これが、ウィンドウ関数としての集合体の使用が、最終関数が読み取り専用であることを必要とする理由である。すなわち、集合体の状態値を損傷してはならない。

ordered-set aggregatesの構文では、最後のdirectパラメーターと最後のaggregated (WITHIN GROUP) パラメーターの両方にVARIADICを指定できます。 しかしながら、現在の実装は、2つの方法でVARIADICの使用を制限する。 まず、オーダードセット集計では、VARIADIC "any" のみを使用でき、他の可変配列タイプは使用できません。 第2に、最後の直接パラメータがVARIADIC「any」である場合、1つの集約パラメータしか存在できず、VARIADIC「any」でなければならない。 (システムカタログで使用される表現では、これらの2つのパラメータは単一のVARIADIC "any" アイテムにマージされます。これは、pg_procが複数のVARIADICパラメータを持つ関数を表すことができないためです。) 集計が仮想集合集計である場合、VARIADIC「any」パラメーターに一致する直接引数は仮想引数です。先行するパラメーターは、集計された引数に一致するように制約されていない追加の直接引数を表します。

現在、オーダードセット集計は、ウィンドウ関数として使用できないため、移動集計モードをサポートする必要はありません。

部分的 (並列を含む) 集計は、現在、オーダードセット集計ではサポートされていません。 また、DISTINCT句またはORDER BY句を含む集約呼び出しには使用されません。これらのセマンティクスは部分集約中にはサポートされないためです。