技术开发 频道

美观实用!SQL云平台监控动态管理视图

  使用动态管理视图监控SQL Azure

  根据目前SQL Azure所提供的三类动态管理视图和函数,在使用动态管理视图的管理场景中,介绍一下管理授权、计算数据库容量、监控连接、性能监控这四个方面的使用。

  (1) 管理授权

  在SQL Azure中,查询一个动态管理视图需要有查看数据库状态(VIEW DATABASE STATE)的权限。VIEW DATABASE STATE返回了当前数据库的所有对象信息,如可以使用如下语句给某个数据库用户授予查看数据库状态的权限。

--管理授权
GRANT VIEW DATABASE STATE
TO database_user

   (2) 计算数据库容量

  云计算服务提供者租用了厂商提供的SQL Azure,租用时要根据数据库的容量、流量等进行付费。一旦数据库的容量超过了付费服务的最大容量,那么就会接收到SQL Azure的提示错误。这时我们就不能插入或更新数据,也不能创建新的数据库对象,如表、视图、存储过程和函数。这时我们可以使用动态管理视图sys.dm_db_partition_stats来统计数据库容量信息。

  计算数据库容量,以M(兆)位单位

--计算数据库容量
SELECT SUM(reserved_page_count)*8.0/1024
FROM sys.dm_db_partition_stats;
GO

   计算单个对象容量,以M(兆)位单位

--计算单个对象容量
SELECT sys.objects.name, SUM(reserved_page_count) * 8.0 / 1024
FROM sys.dm_db_partition_stats, sys.objects
WHERE sys.dm_db_partition_stats.object_id
= sys.objects.object_id
GROUP BY sys.objects.name;
GO

   (3) 监控连接

  我们可以时候动态管理视图sys.dm_exec_connections来查看特定数据库已建立的连接和每个连接的详细信息。在查看连接信息时同时使用了视图sys.dm_exec_sessions。

--监控连接
SELECT
      e.connection_id,
      s.session_id,
      s.login_name,
      s.last_request_end_time,
      s.cpu_time
FROM
      sys.dm_exec_sessions s
      INNER
JOIN sys.dm_exec_connections e
      
ON s.session_id = e.session_id
GO

   (4)性能监控

  缓慢或者执行时间很长的查询消耗系统资源显著,可以使用下面这几种方法来检测数据库查询时的性能问题。

--查找前N条
SELECT TOP 5 query_stats.query_hash AS "Query Hash",
SUM(query_stats.total_worker_time)
/ SUM(query_stats.execution_count) AS "Avg CPU Time",
    MIN(query_stats.statement_text)
AS "Statement Text"
FROM
    (
SELECT QS.*,
    SUBSTRING(ST.text, (QS.statement_start_offset
/2) + 1,
    ((
CASE statement_end_offset
        WHEN
-1 THEN DATALENGTH(st.text)
        
ELSE QS.statement_end_offset END
            
- QS.statement_start_offset)/2) + 1) AS statement_text
     FROM sys.dm_exec_query_stats
AS QS
     CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle)
as ST) as query_stats
GROUP BY query_stats.query_hash
ORDER BY
2 DESC;
GO
--监控查询计划
SELECT
    highest_cpu_queries.plan_handle,  
    highest_cpu_queries.total_worker_time,
    q.dbid,
    q.objectid,
    q.number,
    q.encrypted,
    q.[text]
FROM
    (
SELECT TOP 50  
        qs.plan_handle,  
        qs.total_worker_time
     FROM
        sys.dm_exec_query_stats qs
     ORDER BY qs.total_worker_time desc)
AS highest_cpu_queries
     CROSS APPLY sys.dm_exec_sql_text(plan_handle)
AS q
ORDER BY highest_cpu_queries.total_worker_time desc

   结语

  SQL Azure是一个云的关系型数据库,它可以在任何时间提供客户数据应用,在使用SQL Azure的过程中,我们不仅仅考虑的是数据的正确性和可扩展性,还要注意SQL Azure的性能,我们可以使用SQL Azure提供的动态管理视图和函数来对我们的数据库实例进行监控,并使用数据库、执行和事务三类动态管理视图和函数来运行监控任务。

0
相关文章