2

我有一个 SQL Server 2012 表,它在任何时候都将包含 250 万行。项目总是被写入表中,但表中最旧的行在维护窗口期间每天结束时会被截断。

我有基于 .NET 的报告仪表板,这些仪表板通常会针对汇总表进行报告,尽管有时它确实需要从该表中获取几行——利用索引集。

当它确实针对此表进行报告时,它可以防止将新行写入此表长达 1 分钟,这对产品非常不利。

由于它是一个报告平台,并且此表中的行永远不会更新(仅插入 - 考虑 Twitter 流,但对于不同类型的数据),并不总是需要等待导致插入行的事务中的间隙进入这张表。

在选择要报告的数据时,在事务中使用 SNAPSHOT 隔离级别来选择数据还是 NOLOCK/READ UNCOMITTED 是否明智?围绕 select 语句创建 SQLTransaction 会导致插入仍然阻塞吗?目前我没有将我的 SQLCommand 实例包装在事务中,尽管我意识到这仍然会导致锁定。

理想情况下,我希望写入永远不会被阻止,并且仪表板尽可能响应。我最好的戏是什么?

4

1 回答 1

0

发布您的查询

理论上,选择不应该阻塞插入。

默认情况下,选择只需要一个共享锁。
共享锁在读取操作期间自动获取,并防止用户修改数据。

这不应该阻止插入到 otherTable 或 joinTable

select otherTable.*, joinTable.*  
  from otherTable 
  join joinTable 
    on otherTable.jionID = joinTable.ID

但它确实有获取读锁的开销(它不知道你没有更新)。
但是,如果它只是从 joinTable 中获取几行,那么它应该只获取一些共享锁。
发布您的查询、查询计划和表定义。
我怀疑你有一些奇怪的事情正在发生,它占用的锁比它需要的多得多。
它可能会锁定每一行,也可能会升级为页锁或表锁。

看看插入物。它是否需要一些不需要的疯狂锁。

于 2014-07-10T21:01:48.617 回答