SQL Server 中的 spt_monitor - 表为空是什么意思?

2 sql-server

如果我发现spt_monitorSQL Server中的表为空,这对我的环境意味着什么?

这张表是什么,它是如何使用的以及填充它的是什么?

我正在使用 SQL Server 2005。

在此处输入图片说明

我的 spt_monitor - 表不为空。

我只是问它是否是空的....?

Mik*_*lsh 5

回答您的具体问题:“如果这张桌子是空的,它会告诉我什么?” - 它会告诉您您或某个进程以某种方式截断或删除了该表。它应该总是有一排,当你运行sp_monitor系统存储过程时,该行会被新行覆盖。

有关 spt_monitor 和 sp_monitor 的更多信息

spt_monitor是存储在master数据库中的系统表。该表在您安装 SQL Server 时第一次被填充。它包含有关在 SQL Server 内部跟踪的某些系统资源使用情况的各种信息(如下所述)。

此表的目的是为您提供一种方法来比较其中一些指标随时间的变化。该表将永远只有一行。给出差异的工作是在下面描述的存储过程中完成的 -

sp_monitormaster数据库中的系统存储过程存储过程。此存储过程将当前行读spt_monitor入临时表,然后插入新行并比较所有跟踪的各种计数器之间的差异(包括lastrun给出经过时间的列)。

这个存储过程然后给出每个计数器的当前值以及括号中执行之间的时间差。

我已经包含了我的一台虚拟机的快速示例输出。这是在 46 秒时间范围内大部分处于休眠状态的 VM 上的活动。要解释计数器,请查看packets_received列。根据@@pack_received系统功能,该实例自上次重启以来一共收到了777个数据包,在过去的46秒内一直收到。

示例输出:

sp_monitor
------------------------*/
last_run                current_run             seconds
----------------------- ----------------------- -----------
2012-12-15 22:39:56.770 2012-12-15 22:40:42.500 46

cpu_busy                  io_busy                   idle
------------------------- ------------------------- -------------------------
5(0)-0%                   3(0)-0%                   12366(44)-95%

packets_received         packets_sent             packet_errors
------------------------ ------------------------ ------------------------
777(1)                   627(1)                   0(0)

total_read          total_write         total_errors        connections
------------------- ------------------- ------------------- ------------------
723(0)              153(1)              0(0)                275(0)
Run Code Online (Sandbox Code Playgroud)

如果你发现桌子是空的,你会怎么做?

同样,我很确定这里的空表表明您或您正在运行的某些监视工具或进程清空了该表。或者可能是安装的一部分存在问题。如果您发现该表为空,则您的SQLRoot\MSSQL\Install目录中应该有一个名为u_tables.sql该文件的文件,该文件会创建一些系统表并填充它们。如果您搜索,spt_monitor您将看到此表的创建和插入脚本。reelinsert 脚本(在 SQL Server 2012 RTM 中)如下所示:

insert into spt_monitor
    select
    lastrun = getdate(),
    cpu_busy = @@cpu_busy,
    io_busy = @@io_busy,
    idle = @@idle,
    pack_received = @@pack_received,
    pack_sent = @@pack_sent,
    connections = @@connections,
    pack_errors = @@packet_errors,
    total_read = @@total_read,
    total_write = @@total_write,
    total_errors = @@total_errors
go
Run Code Online (Sandbox Code Playgroud)

最后一句话

我不确定你为什么使用这张表。我建议您在在线书籍中阅读上述每个系统功能。他们中的一些人有关于可能返回不正确数据的各种情况的警告说明。例如,[@@cpu_busy][1]关于数据类型的注释和警告,如果它累积超过 49 天,则不再准确或有效。与其他一些计数器相同。

我实际上从未sp_monitor在我的实例上运行过。直到这个问题,我才深入挖掘并了解它是什么以及它的作用。它看起来很有趣,它提供了大量计数器的数据(您可以在此处了解上面的每个函数),这些计数器乍一看似乎提供了一些有用的数据。

但是,当您深入了解时,获取的大部分信息可能最好以其他方式收集。对于大多数信息,我会查看性能计数器、DMV 和虚拟文件统计信息的组合。该total_errors计数器是有趣的,但我真的不能相信一个有用的情况下的信息呈现的方式。我想在发生磁盘写入错误 ( total_errors) 和警报时收到它们,而不必太担心累积计数。查看重新启动后的总连接数可能会很有趣,如果您不想通过性能监控或在 DMV 上重复查询并添加它来跟踪此信息,这可能会有所帮助。