数据库性能调优技术 --深入理解嵌套循环执行计划

本文深入探讨了数据库性能调优中的嵌套循环连接执行计划,通过Oracle数据库实例,详细介绍了如何理解和分析嵌套循环连接执行计划,包括通过setautotrace和explain plan for命令展示执行计划的方法,并通过具体查询示例解释了不带索引、非唯一索引和唯一索引的嵌套循环连接执行过程。
摘要由CSDN通过智能技术生成

一、概述

这篇文章是数据库性能调优技术的第三篇。上一篇文章讲解了深入了解单表执行计划,单表执行计划是理解多表执行计划的基础。

两张表的连接有三种执行方式: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

-------------------------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值