我需要在Merge语句的行中更新sql server 2008中的表 - 删除,插入,更新。表是700k行,我需要用户仍然具有对它的读访问权,假设提交的读取隔离级别。
我尝试ALTER TABLE table SET (LOCK_ESCALATION=DISABLE)
这样的事情无济于事。我通过从另一个窗口执行select top 50000 *
测试,明显读取未提交工作:)。在没有改变用户的隔离级别并保留“全部或全部”的情况下,无论如何都存在这种情况。交易行为?
我当前批量提交的游标解决方案可能允许用户工作但丢失了事务行为。也许我可以让批量更新足够快,总是小于30秒(超时)。问题是用户的目标数据库是在非常慢的机器上,只有512mb RAM。不确定处理器,但假设它真的很慢,我现在无法访问它们!
我创建了一个测试,导致需要针对所有700k行运行更新语句: 我尝试在我的开发盒上使用左连接进行更新(非常快),这是17秒 合并声明是10秒 FORWARD ONLY游标比两者都慢
这些数字在我的机器上是可以接受的,但如果我可以在允许锁定之前将查询时间缩短到不到5秒,我会感觉更舒服。
有关阻止对表/行进行任何锁定或使其更快的任何想法吗?
答案 0 :(得分:0)
听起来这个表可能会被查询很多但不会更新。如果它确实是其他所有人的真正只读表,但是你想非常快速地更新它,你可以创建一个使用这种方法的脚本(甚至可以将它包装在一个事务中,我相信,虽然它可能是不必要的):
您只会在第3步和第4步之间遇到停机,并且脚本表重命名可能比更新这么多行更快。
这一切都假设在你的进程运行时没有其他人可以更新表,但他们仍然可以在任何点完全读取它,除了3& 4