加入一个特定的表会导致高逻辑读取

Posted

技术标签:

【中文标题】加入一个特定的表会导致高逻辑读取【英文标题】:Joining one particular table causes high logical reads 【发布时间】:2010-07-14 00:03:29 【问题描述】:

我正在 SQL Server 中编写一个连接大约 10 个表的存储过程。当我从查询中排除这个特定表的连接时,逻辑读取看起来是合理的。但是,当我将其包含在内时,某些表的逻辑读取次数上升到 9000。该表具有聚集的主键,并且我像查询中的其他表一样加入它(anotherTable.FK = thisTable.PK)

SQL Server 显示的逻辑读取是否不正确? 我可以采取哪些措施来改善这种行为?

谢谢

【问题讨论】:

你能在你的问题中发布 XML 执行计划吗? 【参考方案1】:

聚簇主键只能带您到此为止 - 它们只是根据聚簇索引确定页面中行的半物理组织。所有数据都存储在树中而不是索引中,因此读取效率几乎没有 - 您仍然有效地读取整行。

为了获得更高的性能,您确实希望覆盖非聚集索引(这些索引通常更窄,因此每页可以容纳更多数据),并且您希望在查看执行计划时看到索引搜索或索引扫描。这些仅读取索引中的信息(加上任何包含的列),并且每页可以容纳更多信息并且能够更快地运行(不会读取和丢弃或跳过太多不必要的数据)。

【讨论】:

【参考方案2】:

由于不了解所有信息,很难确定问题所在。 10 个表是一个相当大的查询。

我会验证查询计划看起来是否正确。它是使用索引而不是表扫描吗?是否按照您期望的顺序加入?

此外,使用临时表帮助我进行了 SQL 调优。使用 select into #tempTable 将大型查询分成更小的部分。临时表之前对我产生了影响。

【讨论】:

以上是关于加入一个特定的表会导致高逻辑读取的主要内容,如果未能解决你的问题,请参考以下文章

为啥这两个相同的表会根据浏览器宽度的不同而表现不同?

在 flag = 'Y' 的表中读取多行的逻辑

创建带有外键的表会出现错误 ORA-00904: : oracle 10g 中的无效标识符 [重复]

由于hadoop高可用状态切换,导致hive在指定数据库下建立以及读取表失败

使用表类型连接表会减慢计算速度?

使用不同的底层文件内容多次读取同一个 Oracle 外部表会引发错误 KUP-05011:文件大小已更改