由SqlCacheDependency引起的SQL Server上的高CPU使用率

时间:2011-09-18 04:08:49

标签: asp.net sql-server sql-server-2008 cpu-usage sqlcachedependency

我们遇到的问题是我们的SQL服务器cpu使用率跳转到并保持在100%,直到网站被关闭并重新启动。我们已经完成了代码并优化了我们所能做的一切,而且这种情况仍在发生。

我们对缓存执行的操作是运行一个查询,该查询从sql server加载整个结构(~6000行),将其存储在缓存中,并查询该缓存以执行我们需要在整个应用程序的其余部分执行的各种操作(有很多递归操作需要对数据执行,否则对sql服务器来说会是一个巨大的打击。)

我描述了上面的内容,因为看起来当使用sql cache依赖时,我们会遇到sql server上的cpu spike。如果它被禁用,我们就不会再遇到尖峰(在sql server或web服务器上),即使我们仍在缓存相同数量的数据。

有谁知道sql缓存依赖可能会导致这样的行为? 使用的SQL Server是SQL Server 2008 R2。 Web服务器是IIS 7.5,我们使用ASP.NET 3.5。此Web服务器设置为集群(x2),它们都指向同一个sql server。

这是加载/设置缓存的代码:

using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString))
{
    cn.Open();

    string query =
        @"SELECT 
            id, 
            parentid, 
            field1, 
            field2, 
            field3, 
            field4, 
            field5
        FROM 
            dbo.theTableWithDataInIt";

    SqlCommand cmd = new SqlCommand(query, cn);
    cmd.Notification = null;
    cmd.NotificationAutoEnlist = true;
    SqlCacheDependencyAdmin.EnableNotifications(
        ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);

    if (!SqlCacheDependencyAdmin.GetTablesEnabledForNotifications(
         ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString)
         .Contains("dbo.theTableWithDataInIt"))
    {
        SqlCacheDependencyAdmin.EnableTableForNotifications(
                    ConfigurationManager.ConnectionStrings["MyConnectionString"].
        ConnectionString, "dbo.theTableWithDataInIt");
    }

    SqlCacheDependency dependency = new SqlCacheDependency(cmd);
    cmd.ExecuteNonQuery();

    //
    // Get Cache Data is a function that returns a DataSet with the data to be added to cache
    //
    Cache.Insert("mycache", GetCacheData(), dependency);
}

1 个答案:

答案 0 :(得分:2)

问题解决了。事实证明索引不知何故变得腐败或丢失。右键单击表中的索引并选择“Rebuild”解决了问题。