第八章 为表连接设计索引
基本问题BQ:是否存在或者计划设计一个索引,使它包含所有被 where 子句引用的列。BQ 背后的原理是:保证只有知道 是必须被访问的表行时,才去访问该表。
基本连接问题 BJQ:是否有一个已经存在或计划添加的索引,包含了所有本地谓词对应的列?在表连接中指包含了涉及的所有表的本地谓词。
合并扫描连接和哈希连接
合并扫描连接执行过程如下:
- 执行表或索引扫描以找出满足本地谓词的所有行。
- 随后可能会进行排序,如果这些扫描未按所要求的顺序提供结果集。
- 对前两步生成的结果集进行合并。
在以下情况中,合并扫描连接会比嵌套循环连接快:
- 用于连接的字段上没有可用的索引。这种情况下,使用嵌套循环,内层表可能需要被扫描很多次。
- 结果表很大。这种情况下使用嵌套循环会导致相同的页被不断重复访问。
- 连接查询中不止一张表的本地谓词的过滤因子很低。嵌套循环可能导致对内层表(或者内层表索引)的大量随机访问。