それは何のためですか?
頻繁に使用される非静的データのキャッシングでは、ネットワーク上の特定のサービスからの応答など、生成に時間がかかります。 クエリで単一値関数を使用するのが非常に便利であるという事実のために生まれましたが、明白な理由でそれらからテーブルに書き込む方法はありません。
ソリューションオプション。
- このデータを保存するためのテーブル、ジョブでのスケジュールされた更新手順、またはその他の悪意のあるダンス、このデータの使用/抽出の便利な形式。
長所:便利で迅速な使用/テーブルからのデータの取得。
短所:データをキャッシュするときの追加の設計と不便さ - データを保存するためのテーブル、このデータを取得するプロシージャ。 手順-それ自体への自転車-テーブル内の必要なデータの可用性をチェックし、存在する場合、与えます、いいえ、前述の<service>にアクセスし、データを受信し、テーブルに書き込み、再び与えます。
長所:コンパクトなソリューション
短所:データを受信するのはひどく不便です。 ご存知のように、MS SQLでは「select * from` StoredProcedure`」を実行できませんが、「Tablet exec` StoredProcedure`に挿入する」だけです - 実際、検討中のオプション。 CLRアセンブリで静的なハッシュテーブルと関数を使用して、データを受信/書き込みします。
長所:比較的単純なケースのための普遍的でかなり迅速なソリューション。
短所:CLRで静的を使用することはお勧めしません。 - また、CLR関数を使用したひどい不正なハックは、別の接続を介してテーブルにデータを書き込みます。
それが実装された例は、非常に頻繁に変更されるツリーを保存する特定のサービスがネットワーク上にあり(通常は約10-15秒の変動頻度で)、要求に応じて、IDシートで指定された(たとえばID = 2012、PATH =メイン/テスター/コンセント)。
SQLサーバー自体
CREATE FUNCTION [dbo].[GetPath] ( @ID INT ) RETURNS VARCHAR(512) AS BEGIN DECLARE @__CACHE_ENABLED BIT = 0;
そして、私たちはこの幸せを、次のような頻繁に重複するリクエストで使用します
SELECT ID, dbo.GetPath(ID) FROM GROUPS WHERE ID IN (…)
さて、そしてプレゼンテーションのために、最も単純なドラフト実装の一部
private static readonly ThreadSafeDictionary<string, ThreadSafeDictionary<string, CacheData>> Cache = new ThreadSafeDictionary<string, ThreadSafeDictionary<string, CacheData>>(); [Microsoft.SqlServer.Server.SqlFunction] public static bool CacheAdd(SqlString section, SqlString key, SqlString value, SqlInt32 availms) { ThreadSafeDictionary<string, CacheData> ht; Cache.TryGetValue(section.Value, out ht); if (null == ht) { ht = new ThreadSafeDictionary<string, CacheData>(); Cache[section.Value] = ht; } DateTime dt = DateTime.Now; ht[key.Value] = new CacheData(value.Value, dt.AddMilliseconds(availms.Value)); return true; } [Microsoft.SqlServer.Server.SqlFunction] public static SqlString CacheGet(SqlString section, SqlString key) { ThreadSafeDictionary<string, CacheData> ht; bool b = Cache.TryGetValue(section.Value, out ht); if (!b || null == ht) return SqlString.Null; CacheData sdp; b = ht.TryGetValue(key.Value, out sdp); if (!b) return SqlString.Null; if (sdp.OutDate > DateTime.Now) { return sdp.Value; } else { ht.Remove(key.Value); } return SqlString.Null; }
そして最後に-
SQLServer'eで静的変数を使用するには、アセンブリにPermission Set = Unrestrictedが必要です
解決策は、むしろ、「もし私たちが変質した場合」というカテゴリに属しますが、負荷に対してまともなパフォーマンスを示しました。
完全なアセンブリコードは、誰かが興味を持っている場合は、レイアウトできます。
免責事項:MSは推奨しません。 メモリに正確。 データの長期保存は保証されません。