在两个表都有聚集索引情况下逻辑读最小每个表只有到次而且只有实际需要输出的数据才会被读入内存页两个表都有非聚集索引情况下消耗的逻辑读和内存资源近似
测试执行Merge Join
执行全表选取或者低选择性选取
执行SQL:
以下是引用片段
Select*FromP_OrderA
InnermergeJOINP_UserBONAMobileNo=BMobileNo
如果两张表都没有任何索引则两张表都要进行全表扫描所有的数据都要读入内存页
逻辑读数近似等于两张表的数据页总和SQL Server处理过程中将使用到临时表
只有一张表有聚集索引的情形类似SQL Server处理过程中将使用到临时表并且读入所有的数据页到内存
如果两张表都有聚集索引尽管两表的数据都会被读入内存页但逻辑读数已经大大减少等于其中一张表总数据内存页数加上最终输出的数据页数而且SQL Server处理过程中将不需要再使用临时表
执行高选择性选取
对于这样的高选择性SQL语句SQL Server 将提示无法生成执行计划
以下是引用片段
Select*FromP_OrderA
InnermergeJOINP_UserBONAMobileNo=BMobileNo
WhereAMobileNo=
但可以执行
以下是引用片段
Select*FromP_OrderA
InnermergeJOINP_UserBONAMobileNo=BMobileNo
WhereAMobileNo<=(注最终结果只有条)
这样的属于低选择性语句但最终结果也很少的语句如前面所述这种情况下采用netsted loop联接效率可能更高
执行高选择性选取
执行如下的SQL语句
以下是引用片段
Select*FromP_OrderA
InnermergeJOINP_UserBONAMobileNo=BMobileNo
WhereAMobileNo=
在两个表都没有任何索引情况下两张表都将执行全表扫描要读入所有的数据页到内存总体逻辑读取决于两表的数据页数
在一个表有聚集索引或者非聚集索引情况下该表将执行Index Seek另一个表将出现全表扫描内存数据缓沖区中将有一张表只读入最终数据所在的数据页一张表读入全部数据页逻辑读数取决于表在联接中的秩序以及无索引表的数据页数
在两个表都有聚集索引情况下逻辑读最小每个表只有到次而且只有实际需要输出的数据才会被读入内存页两个表都有非聚集索引情况下消耗的逻辑读和内存资源近似
测试执行Merge Join
执行全表选取或者低选择性选取
执行SQL:
以下是引用片段
Select*FromP_OrderA
InnermergeJOINP_UserBONAMobileNo=BMobileNo
如果两张表都没有任何索引则两张表都要进行全表扫描所有的数据都要读入内存页
逻辑读数近似等于两张表的数据页总和SQL Server处理过程中将使用到临时表
只有一张表有聚集索引的情形类似SQL Server处理过程中将使用到临时表并且读入所有的数据页到内存
如果两张表都有聚集索引尽管两表的数据都会被读入内存页但逻辑读数已经大大减少等于其中一张表总数据内存页数加上最终输出的数据页数而且SQL Server处理过程中将不需要再使用临时表
执行高选择性选取
对于这样的高选择性SQL语句SQL Server 将提示无法生成执行计划
以下是引用片段
Select*FromP_OrderA
InnermergeJOINP_UserBONAMobileNo=BMobileNo
WhereAMobileNo=
但可以执行
以下是引用片段
Select*FromP_OrderA
InnermergeJOINP_UserBONAMobileNo=BMobileNo
WhereAMobileNo<=(注最终结果只有条)
这样的属于低选择性语句但最终结果也很少的语句如前面所述这种情况下采用netsted loop联接效率可能更高
[] [] [] []