在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. mysql悲观锁总结和实践--转

    原文地址:http://chenzhou123520.iteye.com/blog/1860954 最近学习了一下数据库的悲观锁和乐观锁,根据自己的理解和网上参考资料总结如下: 悲观锁介绍(百科): ...

  2. swift2.0 如何隐藏和设置状态栏

    1.在ViewController中操作当前ViewController的状态栏/** 隐藏状态栏 */ override func prefersStatusBarHidden() -> Bo ...

  3. Xen之初体验:XenMotion、 StorageMotion、Site Recovery、Power Management 各种新、高级功能免费

    Xenserver 的新版本6.2现在已经全面开源,省掉了原有的序列号,也能免费体验曾经标题中的付费高级功能. 安装镜像:http://downloadns.citrix.com.edgesuite. ...

  4. C语言 第七章 数组与字符串

    一.数组 1.1.数组的概念 用来存储一组相同类型数据的数据结构.有点像班上放手机的手机袋,超市的储物柜. 特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素. ...

  5. mininet和ryu控制器的连接

    1.执行ryu应用程式:ryu-manager --verbose ryu.app.simple_switch_13 2.启动mininet,配置如下:创建3个host,1个交换器(open vSwi ...

  6. TreeView控件使用

    treeView1.SelectedNode = treeView1.Nodes[0];  //选中当前treeview控件的根节点为当前节点添加子节点:  TreeNode tmp; tmp = n ...

  7. 12.Struts2自定义拦截器

    12.自定义拦截器        拦截器是Struts2的一个重要特性.因为Struts2的大多数核心功能都是通过拦截器实现的. 拦截器之所以称之为“拦截器”,是因为它可以拦截Action方法的执行, ...

  8. 代码片段添加智能提示,打造一款人见人爱的ORM框架

    SqlSugar ORM优点: 1.高性能,达到原生最高水准,比SqlHelper性能要高,比Dapper快30% 比EF快50% 2.支持多种数据库 ,sql版本更新最快,其它会定期更新,可以在多种 ...

  9. 图片全部加载完成之后再显示页面ui,公司项目里用上,自己写的几行代码

    说明: -----onload事件   这里我并没有考虑ie的兼容性 因为项目是移动端的: -----求大神指正~ -----自己测试正常 页面没加载完之前会有一个提示 /************** ...

  10. HTML5模仿逼真地球自转

    查看效果:http://hovertree.com/texiao/html5/8.htm 给我一个支点,我就可以撬动地球 阿基米德 下载 http://hovertree.com/down/h/ear ...