Производительность запросов SignalR и SqlDependency

У меня есть таблица, в ней около 1 миллиона строк. Эта таблица обновляется веб-сервисами, приложениями CMS и другими источниками. Я хочу отслеживать несколько столбцов в этой таблице. Я читал про SignalR и SqlDependency.

Однако похоже, что SqlDependency будет повторно сканировать всю таблицу при каждом изменении ?? Моя таблица довольно большая, и я не могу позволить себе повторно сканировать БД при каждом изменении.

единственное решение - использовать Trigger или что-то в этом роде? Я действительно хочу держаться подальше от Триггеров.

Вот код:

public IEnumerable<JobInfo> GetData()
{

    using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
    {
        connection.Open();
        using (SqlCommand command = new SqlCommand(
           @"SELECT [JobID],[Name],[LastExecutionDate],[Status]
           FROM [dbo].[JobInfo]", connection))
        {
            // Make sure the command object does not already have
            // a notification object associated with it.
            command.Notification = null;

            SqlDependency dependency = new SqlDependency(command);
            dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

            if (connection.State == ConnectionState.Closed)
                connection.Open();

            using (var reader = command.ExecuteReader())
                return reader.Cast<IDataRecord>()
                    .Select(x => new JobInfo(){ 
                        JobID = x.GetInt32(0), 
                        Name = x.GetString(1), 
                        LastExecutionDate = x.GetDateTime(2),  
                        Status  = x.GetString(3) }).ToList();                            



        }
    }        
}

private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{            
    JobHub.Show(); 
}

Запрос в примере - это ...

SELECT [JobID],[Name],[LastExecutionDate],[Status]
FROM [dbo].[JobInfo]

А теперь представьте, что если бы в этой таблице был миллион строк, это действительно замедлило бы процесс.


person user2404597    schedule 05.09.2015    source источник
comment
Вы контролируете писателя? Просто потому, что в идеале такие вещи должны выполняться разными способами, не с SqlDependency миллионами записей, а ближе к автору или с помощью какого-то механизма pub / sub.   -  person Wasp    schedule 05.09.2015
comment
Не совсем. Но думать о триггере имеет смысл. Каждую ночь я могу обрезать таблицу, которая заполняется с помощью триггера. Что думаешь?   -  person user2404597    schedule 06.09.2015
comment
Я думаю, что это хороший вариант с достаточной гибкостью, чтобы вы могли создавать и управлять своей таблицей извлечения так, как она наиболее соответствует вашим целям. Я вижу, что они вам не нравятся, и я думаю, что понимаю причины, но в этом случае они, вероятно, в порядке.   -  person Wasp    schedule 07.09.2015


Ответы (1)


Вы можете добавить некоторые критерии в свой командный запрос для фильтрации, например:

SELECT [JobID],[Name],[LastExecutionDate],[Status]
FROM [dbo].[JobInfo]
WHERE [LastExecutionDate] > @lastExecutionDate

Затем установите параметр, используя -

command.Parameters.Add(new SqlParameter("lastExecutionDate", SqlDbType.DateTime) { Value = DateTime.Now.ToUniversalTime() });

Таким образом, вы будете получать уведомления (по крайней мере, для вставок / обновлений), если поле LastExecutionDate находится позже, чем последний раз, когда был зарегистрирован SqlDependency.

person Tom Kington    schedule 21.01.2019