数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

SQL Server执行SQL语句时内存占用特点[4]


发布日期:2022年08月30日
 
SQL Server执行SQL语句时内存占用特点[4]

在两个表都有聚集索引情况下逻辑读最小每个表只有而且只有实际需要输出的数据才会被读入内存页两个表都有非聚集索引情况下消耗的逻辑读和内存资源近似

测试执行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联接效率可能更高

[] [] [] []

               

上一篇:SQL Server视图管理中的四个限制条件

下一篇:SQL Server执行SQL语句时内存占用特点[3]