表插入期间锁定...网站不可用(SQL Server 2008)

问题描述:

我有一个后台进程,不断插入表中实时。它可能是一小时数千个插入(有几个更新)。 Web应用程序使用该表来获取需要显示给用户的一些数据。表插入期间锁定...网站不可用(SQL Server 2008)

当前每当后台进程运行其插入/更新时,Web应用程序似乎都被阻止,并且无法访问数据库。

我想知道一个好的解决方案可能是什么。我应该创建另一个表插入并将表复制到另一个只读表中?有另一种方法吗?

任何帮助和建议,非常感谢!

特别是对于SQL Server,您可能需要更改数据库以打开READ_COMMITTED_SHAPSHOT

这基本上可以防止您的选择查询在数据上存在未决的插入/更新时被锁定。

有些东西看会:

1)你的插入/更新或SELECT查询交易的一部分?如果是这样,确保你已经为你的特定情况设置了最有利的transaction isolation level

2)你在这张巨大的桌子上有太多索引吗?索引加速选择,但放慢插入和更新。确保你只有绝对需要的索引。

3)与#2相关。你是否缺少能加速你选择的索引?您的选择语句是否执行全表扫描?查看查询执行计划以查看实际发生的情况。 (查询分析器可以帮助你)。

4)考虑将您的巨型数据复制到一个或多个只读数据库服务器,这些服务器可以处理选择流量,而读/写主表(即您现有的表)主要处理插入/更新流量。

5)您是否触发了可能导致性能问题或锁定问题的插入/更新操作?

6)您的应用程序是否遇到死锁事务?看看这个主题MSDN article,看看它是否有帮助。另外,请确保您了解dining philosophers problem,这样可以避免死锁事务。

如果您使用的是企业版,理想的解决方案是使用滑动窗口分区。本质上,您可以在同一个文件组上创建一个相同的表,将数据加载到所述表中,然后将表的分区“切换”到生产表中。实际的操作只是一个元数据翻转,所以它或多或少瞬间发生。查看更多信息: http://technet.microsoft.com/en-us/library/ms191160.aspx

如果您只是需要从Web应用程序的表中读取数据,则可能需要尝试对查询使用READ_UNCOMMITTED隔离级别。它不占用任何锁并读取未提交的数据。我不会推荐为银行应用程序这样做,但最典型的商业Web应用程序可能不会有问题。请确保在查询后将隔离级别设置回通常使用的内容(READ COMMITTED?)。

如果使用READ_UNCOMMITTED对您不合适,您可以熟悉Row Versioning-Based isolation levels。例如,快照隔离使用乐观的方法来修改数据,从而减少了对行进行悲观锁定的需求。