SQL Server Utility作业剖析
sysutility_mi_collect_performance
该作业在被托管实例上每隔15秒就会运行一次,这个作业调用的是位于MSDB数据库中的sp_sysutility_mi_collect_dac_execution_statistics_internal存储过程,该存储过程会收集被托管DAC的性能数据,并上载到被托管实例的msdb数据库中。
sysutility_mi_collect_and_upload
该作业每隔15分钟才运行一次,这个作业调用的是一段PowerShell脚本,主要用于收集处理器性能统计数据及逻辑卷的容量信息,同样这个作业收集到的数据都是传向被托管实例的msdb数据库。
该作业同时还负责调用msdb数据库中的存储过程sp_sysutility_mi_upload,该存储过程会进一步调用msdb数据库中的另一个系统存储过程sp_syscollector_run_collection_set,而这个存储过程一看便知道属于SQL Server 2008 Data Collection功能所使用的(关于这个我们后面会有详细的介绍)。
sysutility_get_views_data_into_cache_tables
该作业每隔15分钟运行一次,主要任务是将数据从相关的性能数据从sysutility_ucp_staging架构复制到sysutility_ucp_core架构下,然后调用一段PowerShell脚本对性能数据进行评估,最后计算评估结果。
sysutility_get_cache_tables_data_into_aggregate_tables_hourly
该作业每个1小时运行一次,主要任务是对sysutility_ucp_core架构下的处理器及存储空间利用数据进行聚合并存储聚合结果。
sysutility_get_cache_tables_data_into_aggregate_tables_daily
该作业每天运行一次,其主要任务同上面一个任务相似,也是执行聚合,不过这次聚合的粒度不是小时,而是天,另外这个任务在聚合完成后还会清除过期的缓存数据及健康度评估数据(包括前一天的详细数据、小时粒度的聚合数据以及一月前的天粒度聚合数据)。
SQL Server Utility与Data Collection
经过进一步的探索,我们会发现SQL Server Utility其实依赖于SQL Server 2008的一项功能——Data Collection。Data Collection对于已经接触SQL Server 2008的DBA来说应该不陌生,因为微软已经在SQL Server 2008发布的时候大肆宣传过。不过当时仅有三个Collection Set,Disk Usage、Query Statistics及Server Activity。
不过在SQL Server 2008 R2中我们会发现一个新的Collection Set——Utility Information。没错,某些读者可能已经猜到这个新的Collection Set与我们正在介绍的SQL Server Utility有着千丝万缕的关系。
打开这个Collection Set我们就可以清楚地看到其中定义了一项Generic T-SQL类型的收集项目,主要是调用msdb中的若干存储过程和数据表,例如sp_sysutility_mi_get_dac_execution_statistics_internal存储过程。

继续翻到这个Data Collection Set的Upload设置页我们甚至还能发现sysutility_mdw数据仓库在整个流程中的位置(怪不得我一直没有在作业和存储过程定义中找到UCP是如何将数据载入这个最终的数据仓库中)。

了解了这些,DBA应该大致了解SQL Server Utility的工作流程了吧。当然,对于新接触SQL Server 2008的DBA来说就应该去看看有关Data Collection Set的介绍了,相信对于理解SQL Server Utility的工作原理是非常有帮助的。
