4

次のコードを使用して、「People」テーブルの「Name」列の変更に依存してキャッシュしています。ただし、連続して Address 列などの他の列が変更されると、依存関係が発生し、キャッシュが消去されます。(SQL Server 2008 を使用する ASP.NET 4.0)。

public string GetTheVals()
{
    string vals = HttpContext.Current.Cache["TheCacheKey__X"] as string;
    if (vals == null)
    {
        con = GetConnection();
        SqlCommand cmd = new SqlCommand(@"
SELECT Name
FROM dbo.People
", con);            
        con.Open();
        SqlCacheDependency sqlDependency = new SqlCacheDependency(cmd);
        SqlDataReader rdr = null;

        StringBuilder builder = new StringBuilder("");
        rdr = cmd.ExecuteReader();
        while (rdr.Read())
        {
            builder.Append(rdr[0].ToString());
        }
        vals = builder.ToString();

        HttpContext.Current.Cache.Insert("TheCacheKey__X", vals, sqlDependency, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(20));
        CloseConnection(con);
    }
    return vals;
}

結果が変更されたときに発生すると言われていますが、コマンドのクエリにない列の値が変更されたときに発生するのはなぜですか?

デリゲートを OnChange イベントに割り当てることもできます。これは、関連付けられたコマンドの結果が変化したときに発生します。

http://msdn.microsoft.com/en-us/library/62xk7953.aspx

また、列を明示的に指定する必要があるため、テーブルの他の列が除外されて起動しないことがわかります。

  • では、なぜ列名を明示的に指定する必要があるのでしょうか?
  • 開発者が何をしているのか (内部結合を使用する場合など) を認識させ、最悪のパフォーマンスを引き起こす依存関係の作成を回避するためだけですか?

SELECT ステートメントの射影された列は明示的に指定する必要があり、テーブル名は 2 部構成の名前で修飾する必要があります。これは、ステートメントで参照されるすべてのテーブルが同じデータベースにある必要があることを意味することに注意してください。

ステートメントでは、アスタリスク (*) または table_name.* 構文を使用して列を指定することはできません。

ステートメントには、サブクエリ、外部結合、または自己結合を含めることはできません。

http://msdn.microsoft.com/en-us/library/ms181122(v=sql.105).aspx

4

2 に答える 2

3

ただし、MS ヘルプによると:

次のいずれかのイベントが発生すると、SQL Server はサブスクリプションのクエリ通知を送信します。

  • クエリ結果に含まれる行が変更されている可能性があります。

  • サブスクリプションの有効期限が切れます。

  • サーバーが再起動します。

  • クエリ通知サブスクリプションを作成できませんでした (たとえば、SELECT ステートメントが通知用クエリの作成で指定された要件に準拠していません。

  • サーバーの負荷が高くなっています。

  • サブスクリプションが依存するオブジェクトが削除または変更された。

SQL Serverは、データを変更しないイベントに応答して、またはクエリの結果に実際には影響しない変更に応答して、クエリ通知を生成する場合があることに注意してください。たとえば、UPDATE ステートメントがクエリによって返された行の 1 つを変更すると、その行の更新によってクエリ結果の列が変更されていなくても、通知が発生することがあります

于 2012-10-25T08:16:27.093 に答える
1

SQL Cache の依存関係を扱う中で、考慮すべき点がたくさんあることに気付きました。

そのうちの 1 つは、キャッシュ テーブルがデータベースでAspNet_SqlCacheTablesForChangeNotificationを開くのを確認したい場合、列名に応じてテーブルをキャッシュできません。

SELECT TOP 1000 [tableName] ,[notificationCreated] ,[changeId] FROM [dbo].[AspNet_SqlCacheTablesForChangeNotification]

Update、Insert、または Delete で changeId がいつ起動されるかがわかります。これにより、キャッシュのフラッシュがトリガーされます。

コマンド通知で常にクエリを確認することが非常に重要です。上記のように、多くのクエリはサポートされていません。

よろしくお願いします。

于 2012-10-25T08:24:55.037 に答える