パフォーマンスのために関数の結果をメモしたい、つまり、関数の引数にインデックスされたキャッシュを遅延して読み込む必要があります。私が関数を初めて呼び出すとき、キャッシュは入力引数のための何も持っていないので、それを計算し、それを返す前にそれを格納します。後続の呼び出しはキャッシュを使用するだけです。SQL Server 2000のキャッシング関数の結果
しかし、SQL Server 2000では、機能が「確定的」であるという愚かな恣意的なルールがあるようです。 INSERT、UPDATE、および通常のストアドプロシージャ呼び出しは禁止されています。ただし、拡張ストアドプロシージャは許可されています。これはどうやって決定的ですか?別のセッションでデータベースの状態が変更された場合、関数の出力は変更されます。
私は気が狂っています。私はキャッシュをユーザーに透過的にできると思っていました。これは可能ですか?拡張ストアドプロシージャを展開する権限がありません。
EDIT:
この制限は、2008年にまだあるあなたは神のために、RANDを呼び出すことはできません!
キャッシュは私のDBで実装されます。キャッシュは...キャッシングに使用されるすべてのデータストアである
EDIT:
が関数に同じ引数が基本となるデータへの変更の外に、異なる結果が得られます何の例はありません。これはBIプラットフォームであり、唯一の変更はスケジュールされたETLからのもので、その時点でキャッシュテーブルをTRUNCATEします。
O(n^4)のオーダーのI/O集約時系列計算です。私は基礎となるテーブルまたはインデックスを変更する義務を持っていません。また、これらの関数の多くは同じ中間関数を使用し、キャッシングを使用することができます。
UDFは、データベースの状態の変化を考慮しない限り、真に確定的ではありません。ポイントは何ですか? SQL Serverはキャッシュされていますか? (皮肉なことに)SQL Serverがキャッシュしている場合は、スキーマにバインドされているテーブルの変更が期限切れになっている必要があります。それらがスキーマにバインドされている場合、関数が変更するテーブルをバインドしないのはなぜですか?なぜprocsが許可されていないのか分かります。スキーマバインドprocsだけです。そして、なぜ、拡張ストアドプロシージャを許可するのですか?決定論を確実にするためにそれらが何をするかは、おそらく追跡できません!アー!
EDIT:
私の質問は:怠惰ビューで使用することができるように、関数の結果をキャッシュする方法はありますか?
申し訳ありませんが、元の投稿から「最初から」キャッシュを作成していたことがわかりませんでした。どのように同じ関数が同じ議論で異なる結果を返すべきである場合に対処するつもりでしたか? –
何があなたの質問ですか? –