在我的车辆跟踪应用程序中,我使用 sqlServer 数据库,该数据库具有高度填充和高度访问的表“VehilcePosition”,用于存储所有车辆位置。为了显示车辆最新位置,我必须通过自连接和 dateTime 上的组函数 MAX 查询表。我已经在列上设置了索引,但读取查询需要一些时间并获得共享锁,这会阻止表中的插入。由于此表正在更新(插入行)和读取最频繁。应用程序大多由于超时异常而停止,因为读取期间有共享锁,写入期间有排他锁。我需要一个建议,我该如何优化我的数据库以避免这种情况。我使用的是 Core i7 PC(不是服务器机器),唯一的解决方案是将硬件升级到某些服务器机器。
答案1
NOLOCK 的问题在于您偶尔会得到错误的答案。
硬件也不是问题。
最好的解决方案是使用 SQL Server 的“读取已提交快照隔离”。这是数据库级别的设置,在更新行时向读取器返回行的最新版本。它通常是解决此类问题的方法。
另一种解决方案是使用表分区,但这是企业版(和开发人员版)的功能。使用 SQL 2008 中的表分区,您可以指定设置锁定自动,这将仅将锁定升级到分区级别。如果您有足够的分区(允许 15,000 个),大多数查询都不会被阻止。
但读提交快照隔离是最好的解决方案。
答案2
但读取查询需要一些时间并获取共享锁,这会阻止表中的插入
您不需要锁,请告诉 SQL Server 不要将锁放在那里。对此有一个提示。
我正在使用 Core i7 PC(不是服务器机器),唯一的解决方案是将硬件升级到某些
服务器机器。
顺便说一句,这更多的是关于“通过阅读文档来学习正确使用 SQL Server”,而不是升级新硬件。例如,NOLOCK 突然出现在我的脑海中,它是一种告诉读取查询不要锁定行的方法。