在SQL SERVER中如何通过SQL语句获取服务器硬件和系统信息呢?下面介绍一下如何通过SQL语句获取处理器(CPU)、内存(Memory)、磁盘(Disk)以及操作系统相关信息。如有不足和遗漏,敬请补充。谢谢!
一:查看数据库服务器CPU的信息
---SQL 1:获取数据库服务器的CPU型号
EXEC xp_instance_regread \'HKEY_LOCAL_MACHINE\', \'HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0\', \'ProcessorNameString\';
---SQL 2:获取数据库服务器CPU核数等信息(只适用于SQL 2005以及以上版本数据库)
/************************************************************************************* --cpu_count :指定系统中的逻辑 CPU 数 --hyperthread_ratio :指定一个物理处理器包公开的逻辑内核数与物理内核数的比.虚拟机 -- 中可以表示每个虚拟插槽的核数。虚拟中[Physical CPU Count]其实 -- 表示虚拟插槽数 *************************************************************************************/ SELECT s.cpu_count AS [Loggic CPU Count] ,s.hyperthread_ratio AS [Hyperthread Ratio] ,s.cpu_count/s.hyperthread_ratio AS [Physical CPU Count] FROM sys.dm_os_sys_info s OPTION (RECOMPILE);
---SQL 3:获取数据库服务器CPU核数(适用于所有版本)
CREATE TABLE #TempTable ( [Index] VARCHAR(2000) , [Name] VARCHAR(2000) , [Internal_Value] VARCHAR(2000) , [Character_Value] VARCHAR(2000) ); INSERT INTO #TempTable EXEC xp_msver; SELECT Internal_Value AS VirtualCPUCount FROM #TempTable WHERE Name = \'ProcessorCount\'; DROP TABLE #TempTable; GO
---SQL 4:在老外博客中看到一个计算CPU相关信息的SQL,不过虚拟机计算有点小问题,我修改了一下。
DECLARE @xp_msver TABLE ( [idx] [int] NULL ,[c_name] [varchar](100) NULL ,[int_val] [float] NULL ,[c_val] [varchar](128) NULL ) INSERT INTO @xp_msver EXEC (\'[master]..[xp_msver]\');; WITH [ProcessorInfo] AS ( SELECT ([cpu_count] / [hyperthread_ratio]) AS [number_of_physical_cpus] ,CASE WHEN hyperthread_ratio = cpu_count THEN cpu_count ELSE (([cpu_count] - [hyperthread_ratio]) / ([cpu_count] / [hyperthread_ratio])) END AS [number_of_cores_per_cpu] ,CASE WHEN hyperthread_ratio = cpu_count THEN cpu_count ELSE ([cpu_count] / [hyperthread_ratio]) * (([cpu_count] - [hyperthread_ratio]) / ([cpu_count] / [hyperthread_ratio])) END AS [total_number_of_cores] ,[cpu_count] AS [number_of_virtual_cpus] ,( SELECT [c_val] FROM @xp_msver WHERE [c_name] = \'Platform\' ) AS [cpu_category] FROM [sys].[dm_os_sys_info] ) SELECT [number_of_physical_cpus] ,[number_of_cores_per_cpu] ,[total_number_of_cores] ,[number_of_virtual_cpus] ,LTRIM(RIGHT([cpu_category], CHARINDEX(\'x\', [cpu_category]) - 1)) AS [cpu_category] FROM [ProcessorInfo] ---查看虚拟机CPU信息 DECLARE @xp_msver TABLE ( [idx] [int] NULL ,[c_name] [varchar](100) NULL ,[int_val] [float] NULL ,[c_val] [varchar](128) NULL ) INSERT INTO @xp_msver EXEC (\'[master]..[xp_msver]\');; WITH [ProcessorInfo] AS ( SELECT ([cpu_count] / [hyperthread_ratio]) AS [number_of_physical_cpus] ,[hyperthread_ratio] AS [number_of_cores_per_cpu] ,[cpu_count] AS [total_number_of_cores] ,[cpu_count] AS [number_of_virtual_cpus] ,( SELECT [c_val] FROM @xp_msver WHERE [c_name] = \'Platform\' ) AS [cpu_category] FROM [sys].[dm_os_sys_info] ) SELECT [number_of_physical_cpus] ,[number_of_cores_per_cpu] ,[total_number_of_cores] ,[number_of_virtual_cpus] ,LTRIM(RIGHT([cpu_category], CHARINDEX(\'x\', [cpu_category]) - 1)) AS [cpu_category] FROM [ProcessorInfo]
二:查看数据库服务器内存的信息
能否通过SQL语句获取服务器的物理内存大小?内存条型号?虚拟内存大小?内存使用情况? 目前我所知道的只能通过SQL语句获取服务器物理内存大小,内存的使用情况。 至于内存条型号,系统虚拟内存大小,暂时好像还无法通过SQL语句获取。
查看服务器的物理内存情况
如下所示,从sys.dm_os_sys_info里面获取的physical_memory_in_bytes 或physical_memory_kb 的值总是低于实际物理内存。暂时不清楚具体原因(还未查到相关资料),所以计算大小有出入,要获取实际的物理内存,就必须借助CEILING函数。
https://msdn.microsoft.com/zh-CN/goglobal/bb964664.aspx自行补充。
2:操作系统的版本信息的数据来源于https://msdn.microsoft.com/zh-CN/library/ms724832(VS.85).aspx
有可能出现不同操作系统具有相同Version number值,例如Windows 7 和Windows Server 2008 R2的Version numberd都为6.1。导致下面查询结果出现多条记录(如下所示)。一般要酌情判断(如果生产服务器都为Windows服务器,可以剔除Windows XP、Windows 7这类数据)。
ps:使用SQL语句获得服务器名称和IP地址
使用SQL语句获得服务器名称和IP地址 获取服务器名称:
SELECT SERVERPROPERTY(\'MachineName\') select @@SERVERNAME select HOST_NAME()
获取IP地址可以使用xp_cmdshell执行ipconfig命令:
--开启xp_cmdshell exec sp_configure\'show advanced options\', 1 reconfigure with override exec sp_configure\'xp_cmdshell\', 1 reconfigure with override exec sp_configure\'show advanced options\', 0 reconfigure with override go begin declare @ipline varchar(200) declare @pos int declare @ip varchar(40) set nocount on set @ip = null if object_id(\'tempdb..#temp\') is not null drop table #temp create table #temp(ipline varchar(200)) insert #temp exec master..xp_cmdshell\'ipconfig\' select @ipline = ipline from #temp where upper(ipline) like \'%IPv4 地址%\'--这里需要注意一下,系统不同这里的匹配值就不同 if @ipline is not null begin set @pos = charindex(\':\',@ipline,1); set @ip = rtrim(ltrim(substring(@ipline , @pos + 1 , len(@ipline) - @pos))) end select distinct(rtrim(ltrim(substring(@ipline , @pos + 1 , len(@ipline) - @pos)))) as ipaddress from #temp drop table #temp set nocount off end go
但是很多情况下由于安全问题是不允许使用xp_cmdshell,可以通过查询SYS.DM_EXEC_CONNECTIONS :
SELECT SERVERNAME = CONVERT(NVARCHAR(128),SERVERPROPERTY(\'SERVERNAME\')) ,LOCAL_NET_ADDRESS AS \'IPAddressOfSQLServer\' ,CLIENT_NET_ADDRESS AS \'ClientIPAddress\' FROM SYS.DM_EXEC_CONNECTIONS WHERE SESSION_ID = @@SPID
本文地址:https://www.stayed.cn/item/11181
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我