SQL Azure数据库是微软提供的基于云技术的关系型数据库服务。基于云技术的数据解决方案可以提供很多好处,包括快速provisioning, 更经济的的可伸缩性,高可用性并且减少了管理开支。本文介绍了SQL Azure中可用的动态管理视图以及怎样讲它们用于故障排除。
性能注意事项
SQL Azure使用SQL Server 2008的数据引擎作为核心。SQL Server 2005引入的动态管理视图(DMVs)已经成为了强大的故障排除工具,被用于排除从系统状态到死锁信息等各个层次的性能问题。在最初发布的SQL Azure中,大部分的DMV是被禁用的,在之后的计划更新(Service Update)中才被启用。DMV暴露了实例级别的信息。由于SQL Azure是一个共享架构模型,因此需要修改DMV来限制DMV的输出使其只显示适当的信息。下面的DMV已经在***阶段中被启用了。
这些DMV在本地部署的SQL Server中需要VIEW SERVER STATE的权限。在SQL Azure中,查询这些DMV需要新的名为VIEW DATABASE STATE的权限。
和事务有关的DMV
sys.dm_tran_active_transactions:返回与您的当前逻辑数据库的事务有关的信息。
sys.dm_tran_database_transactions:返回有关用户数据库级事务的信息。
sys.dm_tran_locks:返回有关当前处于活动状态的锁管理器资源的信息。向锁管理器发出的已授予锁或正等待授予锁的每个当前活动请求分别对应一行。结果集中的列大体分为两组:资源组和请求组。资源组说明正在进行锁请求的资源,请求组说明锁请求。
sys.dm_tran_session_transactions:返回关联事务和会话的相关信息。
和执行有关的DMV
sys.dm_exec_connections: 返回有关与 Microsoft SQL Azure 数据库建立的连接的信息。
sys.dm_exec_query_plan: 以 XML 格式返回计划句柄指定的批查询的显示计划。计划句柄指定的计划可以处于缓存或正在执行状态。
sys.dm_exec_query_stats: 返回缓存查询计划的聚合性能统计信息。缓存计划中的每个查询语句在该视图中对应一行,并且行的生存期与计划本身相关联。在从缓存删除计划时,也将从该视图中删除对应行。
sys.dm_exec_requests: 返回有关在 Microsoft SQL Azure 服务器内执行的每个请求的信息。
sys.dm_exec_sessions: 返回有关所有活动的用户连接和内部任务的信息。
sys.dm_exec_sql_text: 返回由指定的 sql_handle 标识的 SQL 批处理的文本。该表值函数将替换系统函数 fn_get_sql。
sys.dm_exec_text_query_plan: 为 Transact-SQL 批查询或批查询中的特定语句返回文本格式的显示计划。执行计划句柄指定的查询计划可处于缓存状态或正在执行状态。此表值函数与 sys.dm_exec_query_plan 类似,但存在以下差异:
查询计划的输出以文本格式返回。
查询计划的输出无大小限制。
和数据库相关的DMV
sys.dm_db_partition_stats:为当前数据库中每个分区返回页和行计数信息。只有那些与范围内的服务器直接相关的信息会被暴露出来。在SQL Azure中,那些在SQL Server会返回实例级服务器信息的列将会返回空值。因此,如果你有一些用于SQL Server的自定义故障排除查询,你可以直接在SQL Azure中运行它们而不需要进行修改。
识别性能不佳的查询语句
SQL Server为所有执行的查询生成一个优化过的查询计划。这使得SQL Server的优化器可以在同样或者类似的查询执行的时候重用查询计划,从而在最短的时间内接收数据。一旦数据发生变化,数据列上的统计信息会使得查询计划变得过期和低效。为了获得应用程序的***性能以及一致的用户体验,识别并且调试这些语句非常的重要。之前列出的DMV可以直接帮助识别那些有问题的查询。
下面的是一些用于标识这些有问题的查询的基本查询语句:
过多的重新编译:
- select top 25
- sql_text.text,
- sql_handle,
- plan_generation_num,
- execution_count,
- dbid,
- objectid
- from
- sys.dm_exec_query_stats a
- cross apply sys.dm_exec_sql_text(sql_handle) as sql_text
- where
- plan_generation_num >1
- order by plan_generation_num desc
不够高效的查询计划
- 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
- I/O瓶颈
- select top 25
- (total_logical_reads/execution_count) as avg_logical_reads,
- (total_logical_writes/execution_count) as avg_logical_writes,
- (total_physical_reads/execution_count) as avg_phys_reads,
- Execution_count,
- statement_start_offset as stmt_start_offset,
- sql_handle,
- plan_handle
- from sys.dm_exec_query_stats
- order by
- (total_logical_reads + total_logical_writes) desc
【编者推荐】