Высокая загрузка ЦП на SQL Server, вызванная SqlCacheDependency - PullRequest
0 голосов
/ 18 сентября 2011

У нас возникла проблема, когда наш сервер sql, на котором использование ЦП переходит на 100%, остается до тех пор, пока сайт не будет отключен и перезапущен. Мы просмотрели код и оптимизировали все, что могли, и это все еще происходит.

Что мы делаем с кешем, так это запускаем запрос, который загружает всю структуру (~ 6000 строк) с сервера sql, сохраняет ее в кеше и запрашивает этот кеш для выполнения различных операций, которые нам нужно выполнить в остальной части приложения. (существует множество рекурсивных операций, которые необходимо выполнить с данными, и в противном случае это сильно ударит по серверу sql).

Я описываю вышеизложенное, потому что кажется, что при использовании зависимости кэша sql мы сталкиваемся с выбросом процессора на сервере sql. Если он отключен, мы больше не встречаем всплеск (на сервере sql или веб-сервере), хотя мы все еще кэшируем тот же объем данных.

Кто-нибудь знает, что из-за зависимости кэша sql может вызвать подобное поведение? Используемый сервер sql - SQL Server 2008 R2. Веб-сервер IIS 7.5, и мы использовали ASP.NET 3.5. Эти веб-серверы настроены как кластер (x2), и они оба указывают на один и тот же сервер sql.

Это код, который загружает / устанавливает кэш:

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 Ответ

2 голосов
/ 22 сентября 2011

Проблема была решена. Оказывается, индексы так или иначе стали поврежденными или потерянными. Правый щелчок по индексу в таблице и выбор «Перестроить» решили проблему.

...