0

コンテクスト:

大きなクエリ(疑似)があるとしましょう:

SELECT %boundthing,data
WHERE data in (
    ...do lots of long-running stuff
)

クエリで使用されていないが、出力を出力したい場合を想定しましょう(これはばかげたユースケースですが、句が実行されるまで必要ないことがboundthingわかっている点を示しています)。boundthingWHERE

現状では、選択したプログラミング言語でクエリに値を渡すと、boundthing後でデータベースによって実際に「使用」されるかどうかに関係なく、クエリを実行したときに評価されます。

質問:

(既存のデータベース/プログラミング言語で)評価するバインドスタイルのものをオンデマンドで設定する方法はありますか(つまり、ソースが変数であるか関数であるかにかかわらず、バインドされた変数の値を生成します)クエリプランが作成されるときではなく、クエリ?

たとえば、アプリケーションの擬似コードでは次のように言うことができます。

function MyFunc:
    return "foo" + system.GetEpochTimestamp();

var results = database_handle.Execute( SQL = "
    SELECT %boundthing,data
    WHERE data in (
        ...do lots of long-running stuff
    )", BINDS = [ ("boundthing", MyFunc ) ]
);

また、出力の「boundthing」の値は、句がすべてをフィルタリングした後のアプリケーションサーバーのタイムスタンプに 対応します(アプリケーションサーバーのランタイムを差し引いたものですが、データがデータベースサーバーに到達するまでにかかった時間はどれくらいですか)。およびデータベースによって処理されます)。WHERE myfunc

知りたい理由:

好奇心。

このようなものは、クエリプランナーによって提供される効率の多く(おそらくすべて)をおそらく破壊することを私は知っています。クエリで値が必要になったときにバインドの評価が正確に実行されるという保証はありません(値の送信時間、データベースでの処理時間など)。また、多くの原子性の保証に違反しており、中絶や停止の場合に深刻な問題を引き起こす可能性があることも知っています。

それでも、私は興味があります。

4

1 に答える 1

1
CREATE PROC MyFunc
AS
BEGIN
    SELECT * INTO #MyTempTable FROM data where data in ( ...do lots of long-running stuff);
    $boundthing='EXEC boundthing'
    select $boundthing, * from #MyTempTable
END
GO

それがザックを助けることを願っています。

-ピート

于 2013-03-27T00:27:00.023 に答える