SQL SERVER如何通过SQL语句获服务器硬件和系统信息
原文:SQL SERVER如何通过SQL语句获服务器硬件和系统信息

在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函数。

--SQL 1:获取数据库服务器物理内存数(适用于所有版本)

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/1024 AS PhysicalMemory
FROM    #TempTable
WHERE   Name = 'PhysicalMemory';
DROP TABLE #TempTable;
GO

---SQL 2:适用于SQL Server 2005、SQL Server 2008

SELECT CEILING(physical_memory_in_bytes*1.0/1024/1024/1024)    AS [Physical Memory Size]
FROM sys.dm_os_sys_info  OPTION (RECOMPILE) 
 
 
SELECT physical_memory_in_bytes*1.0/1024/1024/1024
   ,   physical_memory_in_bytes AS [Physical Memory Size]
FROM sys.dm_os_sys_info  OPTION (RECOMPILE)

---SQL 3:适用于SQL Server 2012 到 SQL Server 2014

SELECT CEILING(physical_memory_kb*1.0/1024/1024) AS [Physical Memory Size]
FROM sys.dm_os_sys_info  OPTION (RECOMPILE);

---SQL 4:适用于SQL Server 2008以及以上的版本:查看物理内存大小,已经使用的物理内存以及还剩下的物理内存。

SELECT  CEILING(total_physical_memory_kb * 1.0 / 1024 / 1024)    AS [Physical Memory Size] 
       ,CAST(available_physical_memory_kb * 1.0 / 1024 / 1024 
                                              AS DECIMAL(8, 4)) AS [Unused Physical Memory]
       ,CAST(( total_physical_memory_kb - available_physical_memory_kb ) * 1.0
        / 1024 / 1024 AS DECIMAL(8, 4))                            AS [Used Physical Memory]
       ,CAST(system_cache_kb*1.0 / 1024/1024 AS DECIMAL(8, 4))  AS [System Cache Size]
FROM    sys.dm_os_sys_memory

三:查看数据库服务器硬盘的信息

如下所示,我们可以通过下面脚本获取服务器的各个磁盘的使用情况。但是无法获取磁盘的型号、转速之类的信息。

SET NOCOUNT ON
 
 
DECLARE @Result     INT;
DECLARE @objectInfo     INT;
DECLARE @DriveInfo     CHAR(1);
DECLARE @TotalSize     VARCHAR(20);
DECLARE @OutDrive     INT;
DECLARE @UnitMB     BIGINT;
DECLARE @FreeRat     FLOAT;
 
SET @UnitMB = 1048576;
 
 
 
 
--创建临时表保存服务器磁盘容量信息
CREATE TABLE #DiskCapacity
(
[DiskCD]     CHAR(1) ,
FreeSize     INT     ,
TotalSize     INT    
);
 
INSERT #DiskCapacity([DiskCD], FreeSize ) 
EXEC master.dbo.xp_fixeddrives;
 
EXEC sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE;
 
EXEC sp_configure 'Ole Automation Procedures', 1;
RECONFIGURE WITH OVERRIDE;
 
 
EXEC @Result = master.sys.sp_OACreate 'Scripting.FileSystemObject',@objectInfo OUT;
 
DECLARE CR_DiskInfo CURSOR LOCAL FAST_FORWARD
FOR 
SELECT  DiskCD FROM #DiskCapacity
ORDER by DiskCD
 
 
OPEN CR_DiskInfo;
 
FETCH NEXT FROM CR_DiskInfo INTO @DriveInfo
 
WHILE @@FETCH_STATUS=0
BEGIN
 
EXEC @Result = sp_OAMethod @objectInfo,'GetDrive', @OutDrive OUT, @DriveInfo
 
 
EXEC @Result = sp_OAGetProperty @OutDrive,'TotalSize', @TotalSize OUT
 
 
UPDATE #DiskCapacity
SET TotalSize=@TotalSize/@UnitMB
WHERE DiskCD=@DriveInfo
 
FETCH NEXT FROM CR_DiskInfo INTO @DriveInfo
 
END
 
CLOSE CR_DiskInfo
DEALLOCATE CR_DiskInfo;
 
EXEC @Result=sp_OADestroy @objectInfo
 
EXEC sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE;
 
EXEC sp_configure 'Ole Automation Procedures', 0;
RECONFIGURE WITH OVERRIDE;
 
EXEC sp_configure 'show advanced options', 0
RECONFIGURE WITH OVERRIDE;
 
 
 
SELECT DiskCD     AS [Drive CD]     , 
   STR(TotalSize*1.0/1024,6,2)     AS [Total Size(GB)] ,
   STR((TotalSize - FreeSize)*1.0/1024,6,2)     AS [Used Space(GB)] ,
   STR(FreeSize*1.0/1024,6,2)     AS [Free Space(GB)] ,
   STR(( TotalSize - FreeSize)*1.0/(TotalSize)* 100.0,6,2)  AS [Used Rate(%)]    ,
   STR(( FreeSize * 1.0/ ( TotalSize  ) ) * 100.0,6,2)        AS [Free Rate(%)]
FROM #DiskCapacity;
 
DROP TABLE #DiskCapacity;

四:查看操作系统信息

通过下面SQL语句,我们可以查看操作系统版本、补丁、语言等信息

--创建临时表保存语言版本信息
CREATE TABLE #Language
(
[LanguageDtl]            NVARCHAR(64) ,
[os_language_version]    INT
);
 
 
 
INSERT INTO #Language
SELECT 'English - United States'              ,1033 UNION ALL
SELECT 'English - United Kingdom'             ,2057 UNION ALL
SELECT 'Chinese - People''s Republic of China',2052 UNION ALL
SELECT 'Chinese - Singapore'                  ,4100 UNION ALL
SELECT 'Chinese - Taiwan'                     ,1028 UNION ALL
SELECT 'Chinese - Hong Kong SAR'              ,3076 UNION ALL
SELECT 'Chinese - Macao SAR'                  ,5124;
 
 
WITH SystemVersion(SystemInfo,ReleaseNo)
AS
(
SELECT  'Windows 10' ,
        '10.0*'
UNION ALL
SELECT  'Windows Server 2016 Technical Preview' ,
        '10.0*'
UNION ALL
SELECT  'Windows 8.1' ,
        '6.3*'
UNION ALL
SELECT  'Windows Server 2012 R2' ,
        '6.3'
UNION ALL
SELECT  'Windows 8' ,
        '6.2'
UNION ALL
SELECT  'Windows Server 2012' ,
        '6.2'
UNION ALL
SELECT  'Windows 7' ,
        '6.1'
UNION ALL
SELECT  'Windows Server 2008 R2' ,
        '6.1'
UNION ALL
SELECT  'Windows Server 2008' ,
        '6.0'
UNION ALL
SELECT  'Windows Vista' ,
        '6.0'
UNION ALL
SELECT  'Windows Server 2003 R2' ,
        '5.2'
UNION ALL
SELECT  'Windows Server 2003' ,
        '5.2'
UNION ALL
SELECT  'Windows XP 64-Bit Edition' ,
        '5.2'
UNION ALL
SELECT  'Windows XP' ,
        '5.1'
UNION ALL
SELECT  'Windows 2000' ,
        '5.0'
)        
 
SELECT s.SystemInfo 
      ,w.windows_service_pack_level
      ,l.LanguageDtl
FROM sys.dm_os_windows_info w
INNER JOIN SystemVersion s ON w.windows_release=s.ReleaseNo
INNER JOIN #Language l ON l.os_language_version = w.os_language_version;
 
 
DROP TABLE #Language;

注意:

1:如上所示,临时表#Language的数据此处只列了几条常用的数据,如需全部数据,参考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这类数据)。

参考资料:

http://blog.sqlauthority.com/2012/02/04/sql-server-finding-count-of-logical-cpu-using-t-sql-script-identify-virtual-processors/

http://basitaalishan.com/2014/01/22/get-sql-server-physical-cores-physical-and-virtual-cpus-and-processor-type-information-using-t-sql-script/

http://mssqlwiki.com/2010/11/30/how-to-find-sql-server-and-system-cpu-usage-history/

posted on 2018-08-03 09:22 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/9411581.html

SQL SERVER如何通过SQL语句获服务器硬件和系统信息相关推荐

  1. 【转】在SQL Server中通过SQL语句实现分页查询

    在SQL Server中通过SQL语句实现分页查询 2008年01月06日 星期日 12:28 建立表: CREATE TABLE [TestTable] ( [ID] [int] IDENTITY ...

  2. SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete)

    SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete) SQL Server 2008提供了一个增强的SQL命令Merge,用法参看MS ...

  3. SQL Server FOR XML PATH 语句的应用---列转行

    经常在论坛看到高手使用了 for xml path,由于是搜索一下,记录了详细的使用方法. 在SQL Server中利用 FOR XML PATH 语句能够把查询的数据生成XML数据,下面是它的一些应 ...

  4. 如何从SQL Server中的SELECT语句更新

    In this article, we will learn different methods that are used to update the data in a table with th ...

  5. SQL server 常见的SQL语句总结(最全的)

    ---------------------------------日常学习笔记记录--------------------------------- 总结了大量的SQL语句,没有你不会的,只有你不知道 ...

  6. sql server学习笔记——批处理语句、存储过程

    目录 批处理语句 1.批处理语句简介 示例一: 示例二: 存储过程 一.什么是存储过程 1.存储过程的简介 2.存储过程包含的内容 3.存储过程的优点 4.存储过程的分类 系统存储过程: 用户定义存储 ...

  7. 推荐优秀的SQL脚本调试工具Embarcadero DBArtisan 可以调试SQL Server 2000/2005 SQL调试工具汇总...

    调试SQL语句是经常会碰到的需求,常常为了查找报表的数据是否正确,SQL脚本为什么取不到预想中的数据,一般都可以通过调试SQL语句来解决问题,找到原因.问题不一定是系统的Bug,可能是设置不正确,可能 ...

  8. 在SQL Server中使用SQL Coalesce函数

    This article explores the string manipulation using SQL Coalesce function in SQL Server. 本文探讨了在SQL S ...

  9. SQL Server 2019中SQL表变量延迟编译

    In an article, An overview of the SQL table variable, we explored the usage of SQL table variables i ...

  10. Navicat for SQL Server Mac 版 SQL 创建工具

    2019独角兽企业重金招聘Python工程师标准>>> Navicat for SQL Server 是一个全面的图形化方式管理数据库,可进行创建.编辑和删除全部数据库对象,例如表. ...

最新文章

  1. 为敏捷 BI 补上关键两环
  2. [bzoj 2456]mode
  3. C++CLR类库封装Native类库并用C#调用
  4. 现在中国是以24枚金牌位列奖牌榜3位,美国英国分列1、2位
  5. php 迭代设计模式 -- BookList -- 分页
  6. 抠图为什么要用绿布_逆天抠图,Photoshop 2020天神下凡
  7. 使用systemtap调试Linux内核
  8. Linux shell 查找操作
  9. 双绞线接法详解双绞线的标准的由来与分析
  10. Android kotlin 系列讲解(基础篇) Any和Any?
  11. 公共数据库访问连接类
  12. pythonopencv提取轮廓区域_Python + Opencv 实现轮廓提取,轮廓区域面积计算
  13. 1725 天黑请闭眼
  14. 手机淘宝构架演化实践及优化,天猫,淘宝服务
  15. JN516x串口测试
  16. 采集并显示实时环境温度,环境温度范围为 0°C-40°C,LED 显示 5 位。
  17. fastjson.android首字母大写转化问题
  18. Learning to See in the Dark
  19. 网络安全技术-百度百科大全
  20. 小人的生存之道:灵敏的耳朵和甜蜜的嘴巴。

热门文章

  1. Bert和一些以Bert为基础的预训练模型的Mask区别
  2. Mybatis动态数据源
  3. 分布式爬虫搭建系列 之二-----神器PyCharm的安装
  4. 转:阿里负责人揭秘面试潜规则
  5. 关于ios7的适配问题
  6. [在Windows上使用Unix工具]MKS
  7. Python 之操作so动态库
  8. 四种数据库特性对比(Redis/Mysql/SQLite/MongoDB)
  9. plsql 存储过程 批量提交_浅谈PetShop之使用存储过程与PLSQL批量处理(附案例)
  10. 从网卡发送数据再谈TCP/IP协议—网络传输速度计算-网卡构造