在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/

SQL SERVER如何通过SQL语句获服务器硬件和系统信息的更多相关文章

  1. 【SQL Server DBA】维护语句:删除并创建外键约束、获取建表语句

    原文:[SQL Server DBA]维护语句:删除并创建外键约束.获取建表语句 1.删除外键约束,建立外键约束 先建立3个表: /* drop table tb drop table tb_b dr ...

  2. PowerDesigner反向数据库时遇到[Microsoft][ODBC SQL Server Driver][SQL Server]无法预定义语句。SQLSTATE = 37错误解决方法

    逆向工程中,有时会出现如下错误 ... [Microsoft][ODBC SQL Server Driver][SQL Server]无法预定义语句 SQLSTATE = 37000 解决方案: 1. ...

  3. SQL Server Profiler监控执行语句

    SQL Server Profiler监控执行语句,这个功能主要用在实时的监控对数据库执行了什么操作,从而及时有效的跟踪系统的运行. 常规配置选项,名称.模板.保存到文件(可以复用). 事件选择,可以 ...

  4. SQL Server 定时执行SQL语句的方法

    SQL SERVER 定时任务,你可以启动一下.不过要想更加直观的控制,直接写一个程序,定时执行你的存储过程. 1.设置“SQL Server 代理”(SQL Server Agent)服务随系统启动 ...

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

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

  6. SQL Server中的流控制语句

    begin···end 该语句定义sql代码块,通常在if和while语句中使用 declare @num int ; ; begin ; print 'hello word' end if···el ...

  7. SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第1部分)

    为了缩小读取操作所涉及范围,本文首先着眼于简单的SELECT查询,然后引入执行更新操作有关的附加过程.最后你会读到,优化性能时SQLServer使用还原工具的相关术语和流程. 关系和存储引擎 如图所示 ...

  8. SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第2部分)

    计划缓存(Plan Cache) 如果SQL Server已经找到一个好的方式去执行一段代码时,应该把它作为随后的请求重用,因为生成执行计划是耗费时间且资源密集的,这样做是有有意义的. 如果没找到被缓 ...

  9. SQL Server 127个SQL server热门资料汇总

      SQL Server 127个SQL server热门资料汇总     最近有许多关于如何学习SQLSERVER的问题,其实新手入门的资源和贴子很多,现在向大家隆重推荐经过精心整理的[SQLSer ...

随机推荐

  1. Using Headless Mode in the Java SE Platform--转

    原文地址: By Artem Ananiev and Alla Redko, June 2006     Articles Index This article explains how to use ...

  2. 数据库SQL Service 2014中文版的安装和配置教程

    一.我的电脑环境 1.windows8.1(64位) 2.之前电脑没有安装数据库的软件 二.装机之前准备(我这儿提供百度云保存和下载) 1.下载一个“Sql service 2014中文版” http ...

  3. Python的安装和详细配置

    Python是一种面向对象.解释型计算机程序设计语言.被认为是比较好的胶水语言.至于其他的,你可以去百度一下.本文仅介绍python的安装和配置,供刚入门的朋友快速搭建自己的学习和开发环境.本人欢迎大 ...

  4. 利用Angularjs测试引擎Karma进行自动化单元测试

    Karma是Google用于angularjs框架单元测试的js引擎(javascript test runner ), angular1 和angular2项目源码的单元测试都是基于karma和ja ...

  5. scikit-learn一般实例之三:连接多个特征提取方法

    在很多现实世界的例子中,有很多从数据集中提取特征的方法.很多时候我们需要结合多种方法获得好的效果.本例将展示怎样使用FeatureUnion通过主成分分析和单变量选择相进行特征结合. 结合使用转换器的 ...

  6. jQuery动画

    一.显示和隐藏 hide().show() 1.show():显示被选的元素 2.hide():隐藏被选的元素 3.toggle():对被选元素进行隐藏和显示的切换 语法: $(selector).h ...

  7. [Q&A] 类Range的PasteSpecial方法无效

    环境说明: VS2013(C#) + Office2013 Bug说明: range1.Copy(Type.Missing); range2.PasteSpecial(Excel.XlPasteTyp ...

  8. 客户端调用 WCF 的几种方式

    转载网络代码.版权归原作者所有..... 客户端调用WCF的几种常用的方式: 1普通调用 var factory = new DataContent.ServiceReference1.Custome ...

  9. jQuery页面顶部下拉广告

    本广告可以是图片也可以是Flash,可以设置自动播放的时间,可以手动停止和重播. 效果展示 http://hovertree.com/texiao/jquery/80/ 源码下载:http://hov ...

  10. DES加密中文乱码问题的解决

    服务器向客户端返回时: response.setContentType("text/json; charset=utf-8"); 客户端解码时: return new String ...