我有一个SQL Server 2012表,任何时候都会包含250万行。项始终写入表中,但是在维护窗口期间,表中最旧的行会在每天结束时被截断。
我有基于.NET的报告仪表板,通常会报告摘要表,但在奇怪的情况下它需要从此表中获取几行 - 使用索引集。
当它针对此表进行报告时,它可以防止将新行写入此表最多1分钟,这对于该产品来说非常糟糕。
由于它是一个报告平台,并且此表中的行永远不会更新(仅插入 - 想想Twitter流式传输,但是对于不同类型的数据),并不总是需要等待导致行的事务中的间隙插入此表。
在选择报告数据时,在事务中使用SNAPSHOT隔离级别来选择数据是明智的,还是NOLOCK / READ UNCOMITTED?在select语句周围创建一个SQLTransaction会导致插入仍然阻塞吗?目前我没有在事务中包装我的SQLCommand实例,但我意识到这仍然会导致锁定。
理想情况下,我希望从不阻止写入的结果,并且仪表板尽可能地响应。我最好的表现是什么?
答案 0 :(得分:0)
发布您的查询
理论上,select不应该阻塞插入。
默认情况下,select只接受共享锁 在读取操作期间自动获取共享锁,并防止用户修改数据。
这不应该阻止插入otherTable或joinTable
select otherTable.*, joinTable.*
from otherTable
join joinTable
on otherTable.jionID = joinTable.ID
但它确实有获取读锁定的开销(它不知道你不会更新)。
但是如果它只从joinTable中获取几行,那么它应该只占用一些共享锁
发布您的查询,查询计划和表格定义
我怀疑你有一些奇怪的东西,它需要更多的锁而不是它需要的东西
它可能会锁定每一行,也可能会升级到页面锁定或表锁定。
看看插页。是不是需要一些疯狂的锁。