Signalr 信号员及;SqlDependency查询性能
我有一张桌子,大约有一百万行。此表由web服务、CMS应用程序和其他来源更新。我想监视此表中的几个列。我读到了signar和Signalr 信号员及;SqlDependency查询性能,signalr,sqldependency,Signalr,Sqldependency,我有一张桌子,大约有一百万行。此表由web服务、CMS应用程序和其他来源更新。我想监视此表中的几个列。我读到了signar和SqlDependency 但是,SqlDependency似乎会在每次更改时重新扫描整个表??我的表相当大,每次更改都无法重新扫描数据库 唯一的解决办法是使用触发器还是别的什么?我真的想远离触发器 代码如下: public IEnumerable<JobInfo> GetData() { using (var connection = new Sql
SqlDependency
但是,SqlDependency似乎会在每次更改时重新扫描整个表??我的表相当大,每次更改都无法重新扫描数据库
唯一的解决办法是使用触发器还是别的什么?我真的想远离触发器
代码如下:
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]
WHERE [LastExecutionDate] > @lastExecutionDate
然后使用-
command.Parameters.Add(new SqlParameter("lastExecutionDate", SqlDbType.DateTime) { Value = DateTime.Now.ToUniversalTime() });
这样,当LastExecutionDate字段晚于上次注册SqlDependency时,您将只收到通知(至少针对插入/更新)。您可以在命令查询中添加一些条件以进行筛选,例如-
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时的通知(至少对于插入/更新)。您是否控制编写器?只是因为理想情况下,这类事情应该以不同的方式完成,而不是使用超过数百万条记录的
SqlDependency
,而是更接近编写器或使用一些发布/订阅机制。不是这样。但考虑一个触发器是有意义的。每天晚上我都可以截断通过触发器填充的表。您认为呢?我认为这是一个很好的选择,具有足够的灵活性,可以让您以最适合您的目标的方式构建和管理提取表。我知道你不喜欢他们,我想我理解其中的原因,但在这种情况下,他们可能没问题。你能控制作者吗?只是因为理想情况下,这类事情应该以不同的方式完成,而不是使用超过数百万条记录的SqlDependency
,而是更接近编写器或使用一些发布/订阅机制。不是这样。但考虑一个触发器是有意义的。每天晚上我都可以截断通过触发器填充的表。您认为呢?我认为这是一个很好的选择,具有足够的灵活性,可以让您以最适合您的目标的方式构建和管理提取表。我知道你不喜欢它们,我想我理解其中的原因,但在这种情况下,它们可能没问题。