MS SQLのメモリ内キー値キャッシュ



それは何のためですか?
頻繁に使用される非静的データのキャッシングでは、ネットワーク上の特定のサービスからの応答など、生成に時間がかかります。 クエリで単一値関数を使用するのが非常に便利であるという事実のために生まれましたが、明白な理由でそれらからテーブルに書き込む方法はありません。



ソリューションオプション。




それが実装された例は、非常に頻繁に変更されるツリーを保存する特定のサービスがネットワーク上にあり(通常は約10-15秒の変動頻度で)、要求に応じて、IDシートで指定された(たとえばID = 2012、PATH =メイン/テスター/コンセント)。



SQLサーバー自体
CREATE FUNCTION [dbo].[GetPath] ( @ID INT ) RETURNS VARCHAR(512) AS BEGIN DECLARE @__CACHE_ENABLED BIT = 0; -- /  DECLARE @__CACHE_SECTION VARCHAR(50) = 'ggpi'; --  «»  DECLARE @__CACHE_VALUE_OUTDATE_MS INT = 8000; --    DECLARE @Path VARCHAR(512); IF (@__CACHE_ENABLED = 1) BEGIN SET @Path = dbo.CacheGet(@__CACHE_SECTION, @ID); --   IF (@Path IS NOT NULL) RETURN @Path; END; --      -  SET @Path = ItsALongLongWayToTipperary(@ID); IF (@__CACHE_ENABLED = 1) BEGIN DECLARE @resf BIT; SET @resf = dbo.CacheAdd(@__CACHE_SECTION, @ID, @Path, @__CACHE_VALUE_OUTDATE_MS); --        END; RETURN @Path; END
      
      





そして、私たちはこの幸せを、次のような頻繁に重複するリクエストで使用します
 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は推奨しません。 メモリに正確。 データの長期保存は保証されません。




All Articles