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