在我的车辆跟踪应用程序中,我使用的是sqlServer数据库,该数据库具有一个高度填充和高度访问的表"VehilcePosition",该表存储所有车辆位置。为了显示车辆的最新位置,我必须在dateTime上通过自连接和组函数MAX查询表。我已经在列上了索引,但是读取查询需要一些时间,并获得共享锁,这将阻止表中的插入。由于此表正在更新(插入行)并最频繁地读取。应用程序通常会因为超时异常而停止,因为在读取时使用共享锁,在写入过程中使用排他锁。我需要一个建议,我如何优化我的数据库,以避免这种情况。我使用的是核心i7 PC机(非服务器机),只有将硬件升级到某些服务器机器的解决方案。
发布于 2012-10-15 13:57:25
NOLOCK的问题是你偶尔会得到错误的答案。
硬件也不是问题。
最好的解决方案是使用Server的“ReadCommited快照隔离”--这是一个数据库级别设置,在更新行时向读者返回行的最新版本。这往往是这类问题的解决办法。
另一个解决方案是使用表分区,但这是Enterprise (和Developer )特性。使用SQL 2008中的表分区,您可以指定set lock excalation,这将只将锁升级到分区级别。如果您有足够的分区(15,000个允许的),大多数查询不会阻塞。
但是,读取逗号快照隔离是最好的解决方案。
发布于 2012-10-12 07:42:07
但是读取查询需要一些时间,并获得共享锁,这将阻止表中的插入。
您不希望使用锁,请告诉Server不要将锁放在那里。这是个暗示。
我正在使用核心i7 PC (非服务器机),是唯一的解决方案,以升级硬件到一些服务器机器。
顺便提一句,这是关于“通过阅读文档来学习正确使用sql server”的更多内容,用于升级新硬件。例如,NOLOCK作为告诉读取查询不锁定行的一种方式出现在我的脑海中。
https://serverfault.com/questions/437618
复制相似问题