ShowPlan 输出的示例
使用前面所定义的查询示例并在 Query Analyzer 中执行 set showplan_text on。
查询:
select ckey1,col2 from testtable where ckey1 = 'a'
基于文本的 ShowPlan 输出:
|--Clustered Index Seek(OBJECT:([test].[dbo].[testtable].[testtable2]), SEEK:([testtable].[ckey1]='a') ORDERED)
上面的查询利用“Clustered Index Seek”所示 ckey1 列上的聚集索引。
等量的 Graphical ShowPlan 输出:
图 3 使用聚集索引的查询的 Graphical ShowPlan 输出
如果将聚集索引从表中删除,那么查询需要使用表扫描。以下 ShowPlan 输出显示了行为上的改动。
基于文本的 ShowPlan 输出:
|--Table Scan(OBJECT:([test].[dbo].[testtable]), WHERE:([testtable].[ckey1]='a')) 等量的 Graphical ShowPlan 输出:
图 4 执行表扫描的查询的 Graphical ShowPlan 输出
注意:在小型表中进行表扫描无须担心。对于小型表,表扫描是最有效的检索信息的方法。但是对于大型表,如果 ShowPlan 提出表扫描则是一个警告,说明该表可能需要更好的索引,或者需要对已有索引的统计信息进行更新(这可以使用 UPDATE STATISTICS 命令来完成)。SQL Server 7.0 可自动更新索引。使 SQL Server 自动维护索引统计信息是一个不错的主意,因为它有助于确保查询始终可以使用良好的索引统计信息。
查询:
select nkey1,col2 from testtable where nkey1 = 5000
基于文本的 ShowPlan 输出:
|--Bookmark Lookup(BOOKMARK:([Bmk1000]), OBJECT:([test].[dbo].[testtable]))
|--Index Seek(OBJECT:([test].[dbo].[testtable].[testtable1]), SEEK:([testtable].[nkey1]=5000) ORDERED)
等量的 Graphical ShowPlan 输出:
图 5 利用非聚集索引的查询的 Graphical ShowPlan 输出(第 1 部分)
图 6 利用非聚集索引的查询的 Graphical ShowPlan 输出(第 2 部分)
上面的查询使用 nkey1 列上的非聚集索引。这由 nkey1 列上的“Index Seek”操作指定。“Bookmark Lookup”操作表示 SQL Server 需要将指针从索引页跳到表的数据页以检索所请求的数据。因为查询要求 col2 列,而该列不是非聚集索引的一部分,所以需要指针跳动。
查询:
select nkey1 from testtable where nkey1 = 5000
基于文本的 ShowPlan 输出:
|--Index Seek(OBJECT:([test].[dbo].[testtable].[testtable1]), SEEK:([testtable].[nkey1]=[@1]) ORDERED)
等量的 Graphical ShowPlan 输出:
图 7 隐蔽查询的 Graphical ShowPlan 输出
上面的查询将 nkey1 上的非聚集索引作为覆盖索引作用。请注意此查询不需要“Bookmark Lookup”(书签查找)操作。这是因为非聚集索引可提供查询(包括 SELECT 和 WHERE 子句)所需要的全部信息。这意味着指针不需要从非聚集索引页跳动到数据页。比需要书签查找操作的情况减少了 I/O。
Performance Monitor
Performance Monitor 为数据库服务器中所发生的 Windows 和 SQL Server 操作提供宝贵的信息。有关 SQL Server 的特殊计数器,请在 SQL Server Books Online 中搜索字符串组合“SQL Server:”和“object”。
在 Performance Monitor 的图形模式中,请注意 Max 和 Min 值。不要太强调平均,因为数据点的严重两极分化已使其没有太大的实际意义。研究图形形状,然后将它与 Min/Max 进行比较,以获得对此行为的准确了解。使用
可以在用 Performance Monitor 将所有可用的 Windows NT 和 SQL Server Performance Monitor 对象/计数器记录在日志文件中的同时,交互性地查看 Performance Monitor(图表模式)。采样间隔的设置确定日志文件大小的增长速度。日志文件可以很快就变得非常大(例如,如果打开所有的计数器,且采样间隔为 15 秒,则可以在 1 小时之内增加 100 MB)。但测试服务器有望提供几十亿字节的可用空间来存储这些类型的文件。但是,如果节省空间很重要,那么试着在运行时使用较大的日志记录间隔,以便 Performance Monitor 不会如此频繁地对系统进行采样。试试使用 30 或 60 秒的时间间隔。这样就可以既做到以合理的频率对所有的计数器进行采样,又能保持较小的日志文件。
Performance Monitor 还消耗少量的 CPU 和磁盘 I/O 资源。如果系统没有大量富余的磁盘 I/O 和/或 CPU,那么可以考虑从另一台计算机中运行 Performance Monitor 以监视网络上的 SQL Server(仅图形模式 - 将性能信息记录在本机的 SQL Server 上比在局域网或 LAN 中发送信息效率高),或者仅记录最关键的计数器。
将性能测试运行过程中所有可用的计数器记录在一个文件中以便以后分析是一个不错的主意。这样就可以在以后进一步检查任何计数器。配置 Performance Monitor 以便将所有计数器记录在日志文件中,同时以其它模式(如图形模式)监视最感兴趣的计数器。这样可记录所有的信息,但是只有最感兴趣的计数器可以在性能运行的同时呈现在整齐的 Performance Monitor 图形中。
启动记录功能
打开 Performance Monitor。
从此菜单中选择 View/Log。
单击有 + 符号的按钮。
记录所有计数器的一个简单方法是左键单击 Add to Log 对话框中的第一个对象。
按住 SHIFT 键,使用 PAGE DOWN 键突出显示所有计数器。
单击 Add。
单击 Done。
从此菜单中选择 Options/Log。
在 File Name: 中为要记录的性能信息选择或创建文件名。
单击 Start Log。
停止记录功能
从此菜单中选择 Options/Log。
单击 Stop Log。
将记录的信息加载到 Performance Monitor 中进行分析
从此菜单中选择 View/Log。
从此菜单中选择 Options/Data FromU。
单击 Log File:选项按钮。
单击有“U”标记的按钮,然后使用 Open Input Log File 文件浏览器窗口找到并打开日志文件。双击此文件名。
单击 OK。
单击有 + 符号的按钮。
使用 Add to Chart 对话框将需要的计数器添加到图形显示中。选择要添加的 object/counter(对象/计数器)组合,然后单击 Add。
如何将 Performance Monitor 所记录的事件与时间点关联
此功能对于观察数据库服务器在给定的时间段内所发生的事件十分方便:
使用前面的说明在 Performance Monitor 图表模式中选择并显示所需要的对象/计数器。
从此菜单中选择 Edit/Time Window。
Input Log File Timeframe 对话框将出现。单击所提供的时间窗口滚动条并按住鼠标左按钮,可以调整将显示在 Performance Monitor 图表中所记录数据的开始和停止时间窗口。
单击 OK 将图表重新设置为仅显示为所选的时间窗口记录的数据。
要查看的关键 Performance Monitor 计数器
(Physical 或 Logical)Disk Queue > 2
这部分要求观察几个 Performance Monitor 磁盘计数器。要启用这些计数器,从 Windows NT 命令窗口运行命令“diskperf -y”,然后重新启动 Windows NT。
当正在进行磁盘排队的物理硬盘获得 I/O 处理时,将阻止磁盘 I/O 请求。这些驱动器的 SQL Server 响应时间延长,从而需要更多的查询执行时间。
如果使用 RAID,必需知道有多少个物理硬盘与 Windows NT 视为一个物理驱动器的各个磁盘阵列相连,才能计算出每个物理驱动器的磁盘队列。请教硬件专家关于 SCSI 通道和物理驱动器分布的概念,以了解 SQL Server 数据如何放置在每个物理驱动器中以及每个 SCSI 通道中分布多少 SQL Server 数据。
可以有几种方法通过 Performance Monitor 查看磁盘队列。逻辑磁盘计数器对应通过磁盘管理器分配的逻辑驱动器号,而物理磁盘计数器则对应磁盘管理器视为单个物理磁盘设备的内容。请注意磁盘管理器视为单个物理设备的既可以是单个硬盘,也可以是包含几个硬盘的 RAID 阵列。Current Disk Queue(当前磁盘队列)是磁盘队列的即时测量所得,而 Average Disk Queue(平均磁盘队列)则计算 Performance Monitor 采样期间的平均磁盘队列。请注意以下情形中的所有计数器:Logical Disk:Average Disk Queue > 2,Physical Disk:Average Disk Queue > 2,Logical Disk:Current Disk Queue > 2,或 Physical Disk:Average Disk Queue > 2。
这里所推荐的测量数据是为每个物理硬盘所指定的。如果用这种方法测量 RAID 阵列的磁盘队列,那么这些测量数据应除以 RAID 阵列中的物理硬盘数,才能确定每个物理硬盘中的磁盘队列。
注意 在保存 SQL Server 日志文件的物理硬盘或 RAID 阵列中,磁盘队列不是一个很有用的测量数据,因为 SQL Server Log Manager 的队列不会将 SQL Server 日志文件的多个 I/O 请求排队。
