日期:2014-04-02 浏览次数:20348 次
SQL Server 事件探查器对于协助 DBA 优化他们的 T-SQL 代码而言是真正的不可多得的财富。但是,过度的富有(这让我想起了《一千零一夜》中的阿拉丁)可能会令人不知所措。最近,在我首次尝试弄懂客户端服务器上按跟踪收集的大量数据时,感到了一种“孤立无助”的感觉。在该特定客户端上,联机事务处理系统每小时执行的数据库事务超过四百万个。这意味着,实际上捕获“SQL Batch Completed”事件的 30 分钟跟踪将生成长达两百万行的表格。当然,不利用一些自动化操作来处理这么多的记录是不可行的,即使选择耗时最长或成本最高的事务也未必会有助于标识瓶颈。毕竟,每分钟执行数千次耗时短的事务,可能会导致性能有所下降。[订阅者可能希望重新阅读 Linchi Shea 于 2002 年 06 月为其 Perl 代码撰写的文章“Distill SQL Server Log Files”。Linchi 的 PDF 和 Perl代码均包含在本文的下载中 — 编者注。]www.c hinaitpower.comlfrcxzbU
跟踪清理规则www.c hinaitpower.comlfrcxzbU
我的直觉告诉我使用聚合。但是,由于执行查询中的轻微变化,不用多长时间我就发现按事务类型分组和聚合跟踪文件并不凑效。每个存储过程调用都具有不同的参数,并且查询都是通过不同的搜索参数和稍许不同的 WHERE 子句条件来执行。某些事务包含注释或在其他相同的代码中具有不同数量的空格、制表符或换行符。某些查询使用关键字的同义词。www.c hinaitpower.comlfrcxzbU
为了解决大型跟踪分析的问题,我开发了一个跟踪清理进程,以除去所有跟踪记录的不太重要的细节,并允许按事务类型进行分组。例如,如果我的跟踪文件包含 50,000 条有关相同存储过程执行的记录(每条都带有不同的参数),那么,我的进程会按持续时间、CPU、读取和写入(所有的总计和平均数)对它们进行排列。这使我可以快速标识负责大部分整体系统利用的事务类型。www.c hinaitpower.comlfrcxzbU
跟踪清理的实现要求 1) 分析所有按跟踪记录的 T-SQL 语句,以及 2) 消除变量参数,如以下示例所示。假设此处所列的三个事务均是按跟踪捕获的。 www.c hinaitpower.comlfrcxzbU
1. Proc_A 123, 'alpha', 0x0a9fff8b 2. EXECUTE [Proc_A] -345, 'beta', null /*comment*/ 3. EXEC dbo.Proc_A 9876543, default -- test
虽然所有三个事务都执行存储过程 Proc_A,但是执行、参数、换行符、制表符、空格以及注释中的变化使它们看起来非常不同。我的清理算法会将它们聚合至一个事务类型存储为“Proc_A%”的报告中。www.c hinaitpower.comlfrcxzbU
例如,为了识别这数个事务是否执行同样的存储过程,或将 INSERT 插入带有不同值的相同表格,该清理算法将执行以下操作:www.c hinaitpower.comlfrcxzbU
• |
消除 EXEC 和 EXECUTE 关键字。 www.c hinaitpower.comlfrcxzbU |
• |
将所有的换行符和制表符替换为空格。 www.c hinaitpower.comlfrcxzbU |
• |
将多个空格视为一个整体。 www.c hinaitpower.comlfrcxzbU |
• |
消除任何数字常量、十六进制的值、文字字符串以及 NULL 关键字。 www.c hinaitpower.comlfrcxzbU |
• |
移除两种类型(“double-dash”和 /*...*/)的注释。 www.c hinaitpower.comlfrcxzbU |
• |
移除已消除的参数间的逗号。 www.c hinaitpower.comlfrcxzbU |
• |
删除“dbo”所有者名称,该名称也许会用于许多对象名称之前,并在多数情况中为默认值。 www.c hinaitpower.comlfrcxzbU |