大型SQL Server数据库与死锁?

时间:2015-10-13 10:20:44

标签: sql sql-server performance deadlock

我正在查看一个大小 751 GB 的SQLServer数据库,并且可以在全球拥有多个用户的100个国家/地区访问。

自上个月以来,这个数据库在几张桌子上遇到了死锁。

我怀疑这个巨大的大小会对数据库锁产生影响。在select选择中使用时,我查看了索引和存储过程并在表上应用了update lock

仍然没有影响。

2 个答案:

答案 0 :(得分:0)

如果有用户仅将该表用于报告目的(并且他们查询的数据变化不太快),他们总是可以使用SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED功能。

运行select语句时不会锁定表。但是,您确实需要明智地使用它......因为许多SQL专家会告诉您,您的结果可能不正确。但是,它可能有助于降低您看到的死锁数量。

查看此页面以获取更多信息https://en.wikipedia.org/wiki/Isolation_%28database_systems%29#READ_UNCOMMITTED_.28dirty_reads.29

答案 1 :(得分:0)

您需要分析死锁发生的位置。它与数据库的大小(或者它使用的国家数量)无关。这只是访问数据和模式的问题,使用数据库的应用程序的行为如何。

通常,当一个进程正在读取记录而另一个进程正在更新它们时会发生死锁,并且它们都需要获取更多数据锁,但是无法执行,因为另一个进程已经锁定了这些行并且它们都不会继续,直到另一个完成 - 此时SQL Server会注意到问题并发生死锁。

死锁可能发生在数据或索引上,你应该检查它是哪一个,它可能有助于你弄清楚发生了什么。

要解决此问题,如果您可以更改模式以便始终以相同的顺序访问数据,则不应出现死锁。

另一种方法是查看语句并查看涉及多少I / O.如果语句涉及例如扫描,则创建新索引可能会解决问题。然后,该过程需要访问显着更少的页面,并且死锁的机会将减少。

如果繁忙的数据库中有很多不同的操作一直在同一个表上发生,那么可能无法摆脱所有的死锁,所以你也应该想出一个目标,有多少死锁可以。

我个人会远离脏读(隔离级别读取未提交/使用NOLOCK),除了一些非常特殊的情况,使用它可能会有帮助,因为它也会导致严重的副作用,比如读取相同的数据不止一次。这当然在很大程度上取决于您正在处理的数据/应用程序的类型。