我应该将 SQL Server DMV 与 NOLOCK 一起使用吗

6 performance sql-server dmv performance-tuning

我正在尝试监控无法使用 PerformanceMonitor 跟踪的实时性能数据和使用情况。在生产实时 OLTP 数据库中读取 DMV 的后果是什么?: 例如:sys.dm_tran_locks、sys.dm_os_waiting_tasks、sys.dm_os_performance_counters、sys.dm_exec_connections、sys.dm_io_virtual_file_stats、sys.dm_exec_sql_text 等

我应该在查询 Dmvs 时使用 WITH (NOLOCK) 吗?这会解决许多资源问题吗?在 DMV 中是否有诸如脏读回滚之类的东西。我知道它可以存在于应用程序表中,例如有人提交订单然后取消等。此外,使用 NOLOCK,是否有更高的机会在高容量环境中永远继续,因为我没有锁定行、页面,事情将继续添加到 DMV TableView 中?

谢谢,

Sha*_*nky 1

在生产实时 OLTP 数据库中读取 DMV 会产生什么后果?

就我的经验而言,可以忽略不计。顾名思义,DMV 基本上是视图或函数(如 sys.dm_db_index_physical_stats ),它们从各种缓存和系统表获取信息。DMV 非常轻,可以从缓存中读取数据。它们不会导致阻塞,并且根据您需要非常快速地获取它们的数据量。这里的要点始终是只从缓存中查询您实际需要的数据。

您可以在 DMV 查询中使用 NOLOCK 提示,您会看到有些人使用它,但坦率地说,我认为没有太多必要将它与 DMV 一起使用。但其功能仍然保持不变。因此,当您使用 NOLOCK 提示时,您会对 SQL Server 说,无论数据的状态是什么,它都会向我提供我要询问的数据。它可能已被更改但尚未提交,因此您会得到“脏”数据。NOLOCK 提示避免选择查询在读取数据时获取共享锁。缺点很多

此外,使用 NOLOCK 时,由于我没有锁定行、页面,并且查询将继续添加到 DMV TableView 中,因此在高容量环境中查询是否有更高的机会永远继续下去?

查询只会持续一段时间,直到完成其任务,除非您运行永无止境的循环。NOLOCK 仅确保查询被最小化阻塞,并且还要注意,当使用 NOLOCK 时,如果需要,会采取其他锁定(例如架构稳定性)