一直对旧版本中的系统表和新版本中的系统视图分不清楚。此文参考将系统表映射到系统视图 (Transact-SQL)
实例级别系统视图或函数
1、登录主体
--1、sys.syslogins-->sys.server_principals、sys.sql_logins --sys.server_principals 每个服务器级别主体占一行 --sys.sql_logins 每个SQL Server身份验证登录返回一行 --sys.server_principals比sys.syslogins多SERVER_ROLE类型的主体 select * from sys.server_principals where type_desc='SERVER_ROLE' order by name SELECT pr.principal_id, pr.name, pr.type_desc, pe.state_desc, pe.permission_name FROM sys.server_principals AS pr JOIN sys.server_permissions AS pe ON pe.grantee_principal_id = pr.principal_id;
"-->"左侧表示旧版系统表,"-->"右侧表示新版系统视图(下同)。权限问题可参考数据库权限检查 ,监控系列中的登录名信息建议使用新版系统视图。
2、数据库、数据库文件
--2.1、sysdatabases-->sys.databases select sd.database_id,sd.name DatabaseName,sd.state_desc,sd.log_reuse_wait_desc,sd.create_date,suser_sname(sd.owner_sid) ownername ,sd.collation_name,sd.recovery_model_desc,sd.compatibility_level,sd.user_access_desc ,case sd.is_read_only when 1 then 'READ_ONLY' when 0 then 'READ_WRITE' end as read_only_desc ,sd.page_verify_option_desc ,case when (sd.is_published=1 or sd.is_merge_published=1) then 1 else 0 end as is_published ,sd.is_distributor ,sd.is_encrypted --is_encrypted for >=08 ,sd.is_cdc_enabled --is_cdc_enabled for >=08 from sys.databases sd --2.2、sysaltfiles-->sys.master_files select db_name(mf.database_id) DatabaseName, mf.[file_id],mf.name LogicalName,mf.type_desc,mf.data_space_id,mf.physical_name ,mf.state_desc,mf.size size_page,mf.max_size max_size_page,mf.growth,mf.is_percent_growth,mf.is_read_only,mf.is_sparse,mf.is_name_reserved from sys.master_files mf --对应各DB下的系统视图或函数 select * from sys.database_files select * from sys.filegroups
3、连接、会话信息
--3、sysprocesses-->sys.dm_exec_connections、sys.dm_exec_sessions、sys.dm_exec_requests --sys.dm_exec_connections 返回有关与此 SQL Server 实例建立的连接的信息以及每个连接的详细信息 --sys.dm_exec_sessions 所有活动用户连接和内部任务的信息。 此信息包含客户端版本、客户端程序名称、客户端登录时间、登录用户、当前会话设置等 --sys.dm_exec_requests 返回有关在 SQL Server 中正在执行的每个请求的信息 --查看连接信息 select spid,kpid,blocked,waittype,waittime,lastwaittype,waitresource,dbid,cpu,login_time,last_batch,ecid,open_tran,status from sys.sysprocesses where spid in(52,59) select session_id,most_recent_session_id,connect_time,last_read,client_net_address,most_recent_sql_handle from sys.dm_exec_connections where session_id in(52,59) select session_id,login_time,last_request_start_time,status,transaction_isolation_level,login_name,program_name from sys.dm_exec_sessions where session_id in(52,59) select session_id,start_time,status,database_id,blocking_session_id,wait_type,wait_time,last_wait_type,wait_resource ,statement_start_offset,statement_end_offset from sys.dm_exec_requests where session_id in(52,59)
上图来自监控-阻塞检查中的测试样例。
4、计划缓存
dbcc FREEPROCCACHE go use AdventureWorks2008R2 go exec sp_executesql N'select * from Sales.SalesOrderDetail where ProductID = @pid order by SalesOrderID', N'@pid int',@pid = 870;--870|897 --4、syscacheobjects-->sys.dm_exec_cached_plans、sys.dm_exec_plan_attributes、sys.dm_exec_sql_text、sys.dm_exec_cached_plan_dependent_objects --4.1、sys.dm_exec_cached_plans 缓存的查询计划、缓存的查询文本、缓存计划占用的内存量,以及重新使用缓存计划的计数 SELECT ecp.bucketid,ecp.cacheobjtype,ecp.objtype,ecp.usecounts,ecp.plan_handle,est.[text],eqp.query_plan FROM sys.dm_exec_cached_plans ecp CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS est CROSS APPLY sys.dm_exec_query_plan(ecp.plan_handle) AS eqp WHERE text LIKE N'%Sales.SalesOrderDetail%' GO --4.2、sys.dm_exec_plan_attributes SELECT pvt.plan_handle,pvt.set_options,pvt.sql_handle FROM ( SELECT ecp.bucketid,ecp.cacheobjtype,ecp.objtype,ecp.usecounts,ecp.plan_handle,epa.attribute,epa.[value] FROM sys.dm_exec_cached_plans ecp OUTER APPLY sys.dm_exec_plan_attributes(plan_handle) AS epa WHERE plan_handle=0x06000700331CE236B880510E000000000000000000000000 ) AS ecpa PIVOT (MAX(ecpa.value) FOR ecpa.attribute IN ("set_options","sql_handle")) AS pvt GO --补充1、sys.dm_exec_query_stats 返回 SQL Server中缓存查询计划的聚合性能统计信息 --特定语句聚合性能统计µs select top 100 SUBSTRING (c.text,(b.statement_start_offset/2) + 1 ,((CASE WHEN b.statement_end_offset = -1 THEN LEN(CONVERT(NVARCHAR(MAX), c.text)) * 2 ELSE b.statement_end_offset END - b.statement_start_offset)/2) + 1) RunSQL ,b.creation_time --编译计划的时间 ,b.last_execution_time --上次开始执行计划的时间 ,b.execution_count AS SQLExCount--计划自上次编译以来所执行的次数 ,b.last_logical_reads --上次执行计划时所执行的逻辑读取次数 ,b.total_logical_reads/b.execution_count avg_logical_reads ,b.last_worker_time --上次执行计划所用的 CPU 时间(微秒) ,b.last_elapsed_time --最近一次完成执行此计划所用的时间(微秒) ,b.total_elapsed_time/b.execution_count avg_elapsed_time --上次完成执行此计划所用的总时间 --,b.sql_handle,b.plan_handle --,d.query_plan ,c.text FROM sys.dm_exec_query_stats b with(nolock) CROSS APPLY sys.dm_exec_sql_text(b.sql_handle) c CROSS APPLY sys.dm_exec_query_plan(b.plan_handle) d where c.text like '%Sales.SalesOrderDetail%' --补充2、sys.dm_exec_procedure_stats 返回缓存存储过程的聚合性能统计信息 --返回做IO数目最多的存储过程以及它们的执行计划(微秒) SELECT TOP 20 DB_NAME(eps.database_id) DBname ,OBJECT_NAME(eps.object_id,eps.database_id) ProcName ,eps.cached_time ,eps.last_execution_time ,eps.execution_count ,eps.last_logical_reads ,eps.total_logical_reads / eps.execution_count avg_logical_reads ,eps.total_logical_writes / eps.execution_count avg_logical_writes ,eps.total_physical_reads / eps.execution_count avg_physical_reads --,eps.total_worker_time / eps.execution_count AS avg_worker_time ,eps.total_elapsed_time / eps.execution_count avg_elapsed_time --,b.text ,c.query_plan ,eps.plan_handle FROM sys.dm_exec_procedure_stats AS eps CROSS APPLY sys.dm_exec_sql_text(eps.sql_handle) b CROSS APPLY sys.dm_exec_query_plan(eps.plan_handle) c WHERE OBJECT_NAME(eps.object_id,eps.database_id) ='procname' ORDER BY eps.total_logical_reads/eps.execution_count desc dbcc freeproccache(0x06000700331CE236B880510E000000000000000000000000) select * from sys.dm_exec_query_plan(0x06000700331CE236B880510E000000000000000000000000) select * From sys.dm_exec_sql_text(0x06000700331CE236B880510E000000000000000000000000)
很多计划、性能信息都可以从上面的系统视图查看,2005版查看存储过程的执行情况
5、性能计数器
--5、sys.sysperfinfo-->sys.dm_os_performance_counters 为服务器维护的每个性能计数器返回一行 --最大服务器内存 SELECT top 10 *,cntr_value/1024 cntr_value_mb FROM sys.dm_os_performance_counters with(nolock) where counter_name like '%Server Memory%' --Total Pages:BufferPool的总大小(等于DatabasePages+Free Pages+Stolen Pages)。 --该值乘以8KB,应该等于MemoryManager:TotalServer Memory的值。而TotalServer Memory(KB):SQLServer缓冲区提交的内存,基本等于SQL使用的内存。 select top 10 * , cast(p.cntr_value*8/1024.0 as int) as MemoryMB from sys.dm_os_performance_counters p with(nolock) where p.object_name like '%MSSQL$SQL08R2:Buffer Manager%' and (p.counter_name like '%Total Pages%' or p.counter_name like '%Free Pages%' or p.counter_name like '%Target Pages%' or p.counter_name like '%Stolen Pages%' or p.counter_name like '%Database Pages%')