在我的情况下,NOLOCK,快照或其他什么?

时间:2014-07-10 19:03:48

标签: sql-server database tsql data-warehouse nolock

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

我有基于.NET的报告仪表板,通常会报告摘要表,但在奇怪的情况下它需要从此表中获取几行 - 使用索引集。

当它针对此表进行报告时,它可以防止将新行写入此表最多1分钟,这对于该产品来说非常糟糕。

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

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

理想情况下,我希望从不阻止写入的结果,并且仪表板尽可能地响应。我最好的表现是什么?

1 个答案:

答案 0 :(得分:0)

发布您的查询

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

默认情况下,select只接受共享锁 在读取操作期间自动获取共享锁,并防止用户修改数据。

这不应该阻止插入otherTable或joinTable

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

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

看看插页。是不是需要一些疯狂的锁。