2017-06-10 2 views
0

複数の値を返すSUDFの確定フラグをテストしようとしています(thisへの質問に続きます)。 DETERMINISTICフラグは、パフォーマンスを向上させるために同じ入力に対する結果をキャッシュする必要があります。しかし、私は複数の戻り値に対してこれを行う方法を理解できません。確定的なSUDFから複数のout-paramsを選択するパフォーマンス

CREATE FUNCTION DET_TEST(IN col BIGINT) 
RETURNS a int, b int, c int, d int DETERMINISTIC 
AS BEGIN 
    a = 1; 
    b = 2; 
    c = 3; 
    d = 4; 
END; 

を今、私は次のselect文を実行すると::

1) select DET_TEST(XL_ID).a from XL; 
2) select DET_TEST(XL_ID).a, DET_TEST(XL_ID).b from XL; 
3) select DET_TEST(XL_ID).a, DET_TEST(XL_ID).b, 
      DET_TEST(XL_ID).c, DET_TEST(XL_ID).d from XL; 

を私は、対応するサーバ処理時間を取得:

1) Statement 'select DET_TEST(XL_ID).a from XL' 
    successfully executed in 1.791 seconds (server processing time: 1.671 seconds) 
2) Statement 'select DET_TEST(XL_ID).a, DET_TEST(XL_ID).b from XL' 
    successfully executed in 2.415 seconds (server processing time: 2.298 seconds) 
3) Statement 'select DET_TEST(XL_ID).a, DET_TEST(XL_ID).b, DET_TEST(XL_ID).c, ...' 
    successfully executed in 4.884 seconds (server processing time: 4.674 seconds) 

あなたが処理を見ることができるように私のSUDFは、次のようになります私は同じ入力で関数を呼び出すにもかかわらず、時間が増えます。これはバグですか、あるいは単一の値だけがキャッシュに格納され、リターンパラメータのリスト全体には格納されない可能性がありますか?

次にMAP_MERGEを試してみます。

答えて

0

私はあなたのシナリオでいくつかのテストを行い、関数から取得した追加の結果パラメータごとに応答時間が大幅に増加することを確認できます。 DETERMINISTICフラグはここで役立ちますが、個別の入力パラメータの結果値のみが保存されるため、期待したほどのものではありません。 したがって、同じ値が関数に入力され、これらの値で前に実行された場合、結果はキャッシュから取得されます。 このキャッシュは、のステートメント中に有効なのはです。つまり、1つのステートメントで同じ値を繰り返して関数を評価する場合、関数DETERMINISTICは関数の評価をスキップして結果を再利用することができます。

これは、すべての出力パラメータが一度評価され、再利用できることを意味するものではありません。実際、異なる出力パラメータでは、HANAは実際には異なる評価グラフを実行する必要があります。その意味では、さまざまなパラメータを求めることは、行列演算を呼び出すこととは異なる関数を実行することに近くなります。

他のスレッドでは、DETERMINISTICの機能を使用して大幅な改善が期待されて申し訳ありません。少なくともあなたのユースケースでは、それは本当に多くの助けにはなりません。

MAP_MERGE関数については、これが本当にデータの水平分割に役立つことが重要です。古典的な地図を減らす状況。 あなたが提示したユースケースは実際には行っていませんが、1つの入力に対して複数の結果を作成しようとしています。

私のテストでは、実際には4つの独立した関数を定義して、ソーステーブルに対してSELECTの文を呼び出す方が速いことがわかりました。

計算の複雑さやデータ量によっては、AFL(Application Function Library)SDKをSAP HANAに使用することが考えられます。詳細については、関連するSAPノートをチェックする必要があります。

+0

これは私にとって面倒ですが、情報に感謝します。私はすでに複数のUDFをテストしましたが、タプルごとに複数のudfsを呼び出すだけのオーバーヘッドは非常に大きいので、私の目的には役に立たないことが判明しました。だからこそ、私は単一のUDFですべての値を計算しようとしたのです:/ – Jan

+0

異なる出力パラメータを使って_Indeedについて少し詳しく説明できますか、実際にはHANAは異なる評価グラフを実行していますか?それはなぜですか/それとも何の評価グラフですか、それとももっと詳しい情報のリンクですか? – Jan

+0

それは表現の内部評価グラフです。したがって、関数またはプロシージャから出力パラメータを照会すると、HANAはこれを最適化し、内部的に評価ツリーを作成し、計算に必要なすべてのステップをカバーします。異なる出力パラメータの場合、この評価ツリーは同じ機能で定義されていても異なります。 SQLでうまく表現できない複雑なデータ操作については、おそらくAFL SDKがパフォーマンス上の最良の選択です。しかしそれはC++の開発です。 –

関連する問題