一、概述
这篇文章是数据库性能调优技术的第三篇。上一篇文章讲解了深入了解单表执行计划,单表执行计划是理解多表执行计划的基础。
两张表的连接有三种执行方式:1)嵌套循环连接;2)散列连接;3)归并连接。两张表连接时选择这三种中的哪一种呢?这取决于索引、以及连接的代价。在该系列的第三篇(本文)文章中讲解嵌套循环连接,第四篇文章中讲解散列连接,第五篇文章中讲解归并连接。在第六篇以后会分析 IN 子查询以及 EXISTS子查询。
达梦数据库、oracle 数据库、sql server 数据库在数据库执行计划方面并无本质区别,因此上篇文章使用达梦数据库作为实例数据库进行分析,这篇文章我们选择 oracle 10g作为实例数据库。
读完本文后,应该能够读懂这三个数据库的嵌套循环连接执行计划。
另外需要申明一点的是:因为 oracle 的源代码是不公开的,我这里描写的是根据执行计划、成本代价以及 10053 文件进行反推的结果,尽管这样,从大的方向上讲,不会出现问题,仅做抛砖引玉。
二、深入理解嵌套循环执行计划
Oracle 数据库常用的显示执行计划的方式有两种:
1)setautotrace on 命令;
2)explain planfor 命令;
举例说明使用 setautotrace 命令:
SQL>create table t1(c1 int,c2 int);
Tablecreated.
SQL>create index it1c1 on t1(c1);
Indexcreated.
SQL>insert into t1 values(1,1);
1row created.
SQL>insert into t1 values(2,2);
1row created.
SQL>commit;
Commit complete.
SQL>set autotrace on explain;
SQL>select c1 from t1 where c1=1;
C1
----------
1
ExecutionPlan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=1 Card=1 Bytes=13)
1 0INDEX (RANGE SCAN) OF 'IT1C1'(INDEX) (Cost=1 Card=1 Bytes=13)
SQL>set autotrace off;
SQL>
我们可以看到,执行了“setautotrace on explain;”语句之后,接下来的查询、插入、更新、删除语句就会显示执行计划,直到执行“setautotrace off;”语句。如果是设置了“setautotrace on;”,除了会显示执行计划之外,还会显示一些有用的统计信息。本系列文章不涉及查询代价的评估分析。
我们从上一段代码中,我们发现在显示“selectc1 from t1 where c1=1;”执行计划之前显示了该执行语句的查询结果。这说明:显示执行计划之前就真正地将该查询语句执行了一遍。这样会带来一个不好后果,假设我们现在有一条语句,执行的时间需要半个小时,即使我们仅仅需要知道该语句的执行计划,此种情况下,我们必须等待半个小时。因此,如果查询的性能很慢,我们可以选择选择使用explain plan for 命令,举例说明explain plan for 命令:
SQL>explain plan for select c1 from t1 where c1=1;
Explained
SQL>select * from table(DBMS_XPLAN.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Planhash value: 2624316456
--------------------------------------------------------------------------
Id Operation Name Rows Bytes Cost (%CPU) Time
----------------------------------------------------------------------------------------------------------------
0 SELECT STATEMENT 1 13 1 (0) 00:00:01
*1 INDEX RANGESCAN T1C1 1 13 1 (0) 00:00:01
-------------------------------------------------------------------------------------------