技术开发 频道

数据库性能调优技术之嵌套循环执行计划

  【IT168 文档一、概述

  单表执行计划是理解多表执行计划的基础。

  两张表的连接有三种执行方式:1)嵌套循环连接;2)散列连接;3)归并连接。两张表连接时选择这三种中的哪一种呢?这取决于索引、以及连接的代价。在该系列的第三篇(本文)文章中讲解嵌套循环连接,第四篇文章中讲解散列连接,第五篇文章中讲解归并连接。在第六篇以后会分析IN子查询以及EXISTS子查询。

  达梦数据库、oracle数据库、sql server数据库在数据库执行计划方面并无本质区别,因此上篇文章使用达梦数据库作为实例数据库进行分析,这篇文章我们选择oracle 10g作为实例数据库。

  读完本文后,应该能够读懂这三个数据库的嵌套循环连接执行计划。

  另外需要申明一点的是:因为oracle的源代码是不公开的,我这里描写的是根据执行计划、成本代价以及10053文件进行反推的结果,尽管这样,从大的方向上讲,不会出现问题,仅做抛砖引玉。

  二、深入理解嵌套循环执行计划

  Oracle数据库常用的显示执行计划的方式有两种:

  1) set autotrace on 命令;

  2) explain plan for 命令;

  举例说明使用set autotrace命令:

  SQL> create table t1(c1 int,c2 int);
  
Table created.
  SQL
> create index it1c1 on t1(c1);
  
Index created.
  SQL
> insert into t1 values(1,1);
  
1 row created.
  SQL
> insert into t1 values(2,2);
  
1 row created.
  SQL
> commit;
  
Commit complete.
  SQL
> set autotrace on explain;
  SQL
> select c1 from t1 where c1=1;

  我们可以看到,执行了“set autotrace on explain;”语句之后,接下来的查询、插入、更新、删除语句就会显示执行计划,直到执行“set autotrace off;”语句。如果是设置了“set autotrace on;”,除了会显示执行计划之外,还会显示一些有用的统计信息。本系列文章不涉及查询代价的评估分析。

  我们从上一段代码中,我们发现在显示“select c1 from t1 where c1=1;”执行计划之前显示了该执行语句的查询结果。这说明:显示执行计划之前就真正地将该查询语句执行了一遍。这样会带来一个不好后果,假设我们现在有一条语句,执行的时间需要半个小时,即使我们仅仅需要知道该语句的执行计划,此种情况下,我们必须等待半个小时。因此,如果查询的性能很慢,我们可以选择选择使用explain plan for命令。

0
相关文章