需要一些帮助理解IO统计

时间:2010-01-06 22:17:41

标签: sql sql-server sql-server-2005

4 个答案:

答案 0 :(得分:2)

来源:MS SQL Server 2008 R2 Unleashed

扫描计数 扫描计数值表示访问相应表的次数 在查询执行期间。嵌套循环连接的外表通常具有扫描计数 1.内表的扫描计数通常反映内部表的扫描次数 搜索表,通常与外部符合条件的行数相同 表。内表的逻辑读取数等于扫描计数的乘积 每次扫描每次查找的页数。请注意内部的扫描计数 如果SQL Server复制所需的行,则表有时可能只有1表示嵌套连接 从内部表到高速缓冲存储器中的工作表并从工作表中读取 后续迭代(例如,如果它使用表假脱机操作)。扫描计数 对于参与连接的两个表,散列连接和合并连接通常为1,但是 这些类型的连接的逻辑读取通常要高得多。

逻辑阅读 逻辑读取值表示处理所需的页面访问总数 查询。即使首先必须从磁盘读取,也会从高速缓存中读取每个页面。 每个物理读取总是有相应的逻辑读取,所以物理数量 读取永远不会超过逻辑读取的数量。由于可能会多次访问同一页面,因此表的逻辑读取次数可能会超过总数 表格中的页数。

物理阅读 物理读取值表示从磁盘读取的实际页数。价值 对于物理读取可能会有很大差异,应随之减少或降至零 执行查询,因为数据将由第一个加载到数据缓存中 执行。物理读取的数量也会因引入的页面而降低 预读机制的内存。

预读“ 预读读取值表示使用读取到高速缓冲存储器的页数 处理查询时的预读机制。由预读读取的页面 机制不一定会被查询使用。当一个页面由预读读取时 查询访问机制,它计为逻辑读取,但不作为物理读取。预读机制可以被认为是物理I / O的乐观形式, 将页面读入缓存内存,它在查询之前需要查询 需要他们。当您扫描表或索引时,表的索引分配映射 查看页面(IAM)以确定哪些范围属于该对象。一定程度 由八个数据页组成。只读一次读取范围中的八个页面 扩展区按照它们存储在磁盘上的顺序读取。如果表格遍布 多个文件,预读机制尝试从a最多八个文件进行并行读取 时间而不是顺序读取files.read。

答案 1 :(得分:1)

似乎有一个相当昂贵的索引扫描Table 'RPT_SnapShot_1_4_StuPgm_Denorm'. Scan count 2344954, logical reads 4992518

答案 2 :(得分:1)

您已经执行了“设置统计信息IO ”。在“查询”菜单中,启用“包含实际执行计划”和“包含客户统计信息”。 运行您的查询/过程。 在“消息”标签中查找最高的“逻辑读取”数字,记住该表格。 在“执行计划”选项卡中,查找您之前在步骤中找到的表(通常具有与计划关联的最高成本百分比)。 如果是“扫描”(表扫描或索引扫描),则缺少相应的索引,或者相应的索引没有良好的统计信息。 如果它是“Seek”,那么你正在寻找的行被大量分散。您必须通过在所寻找的列上创建CLUSTERED索引来将它们物理地组合在一起。这是非常有效的方法。 没有多少人知道聚集索引是什么。花一些时间研究它们。默认情况下,Sql server会创建群集的主键,大多数人都会这样离开。在许多情况下,它可能导致性能下降。您需要聚簇索引,以按照构建聚簇索引的列对行进行物理分组。每个表只能有一个聚簇索引。聚簇索引不必是唯一的,不必是PK,可以包含多个列。 您可以重写查询,例如替换存在于IN,反之亦然,或替换表连接存在。 没有“最快”的加入方法。如果有一个,所有其他类型将自动转换为最快的类型。这取决于数据,可用指标,内存量等。

始终测量,不要假设。衡量只是事实。对于您设法减少逻辑读取的程度,您成功地优化了查询。其他优化将是DBA完成的数据库级别(内存缓存,并行进程,存储系统,检查等待事件等)。

答案 3 :(得分:0)

值得担忧的唯一数字是“Logical Reads”。物理读取将取决于当前缓存的数据量,每次运行查询时都会更改。

扫描计数有时告诉,但并不值得关注。

修改:查看有关这些结果的更多讨论in this post here. 我所说的“告诉”是指扫描计数有时可能是一个“标志”,表明SQL正在低效地从该表中检索数据。但是当你在优化时尝试不同版本的查询时,我会更加关注我在逻辑读取方面所做的改进。