`
newleague
  • 浏览: 1514021 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

分析SQL语句的执行计划优化SQL(七)_2

阅读更多

创建索引:
create index inx_col12A on a(col1,col2);
select A.col4
from C , A , B
where C.col3 = 5 and A.col1 = B.col1 and A.col2 = C.col2
and B.col3 = 10;
Execution Plan
----------------------------------------------------------
0   SELECT STATEMENT Optimizer=CHOOSE
1  0  MERGE JOIN
2  1   SORT (JOIN)
3  2    NESTED LOOPS
4  3     TABLE ACCESS (FULL) OF 'B'
5  3     TABLE ACCESS (BY INDEX ROWID) OF 'A'
6  5      INDEX (RANGE SCAN) OF 'INX_COL12A' (NON-UNIQUE)
7  1   SORT (JOIN)
8  7    TABLE ACCESS (FULL) OF 'C'

select /*+ ORDERED */ A.col4
from C , A , B
where C.col3 = 5 and A.col1 = B.col1 and A.col2 = C.col2
and B.col3 = 10;
Execution Plan
----------------------------------------------------------
0   SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=1 Bytes=110)
1  0  HASH JOIN (Cost=5 Card=1 Bytes=110)
2  1   HASH JOIN (Cost=3 Card=1 Bytes=84)
3  2    TABLE ACCESS (FULL) OF 'C' (Cost=1 Card=1 Bytes=26)
4  2    TABLE ACCESS (FULL) OF 'A' (Cost=1 Card=82 Bytes=4756)
5  1   TABLE ACCESS (FULL) OF 'B' (Cost=1 Card=1 Bytes=26)

select /*+ ORDERED USE_NL (A C)*/ A.col4
from C , A , B
where C.col3 = 5 and A.col1 = B.col1 and A.col2 = C.col2
and B.col3 = 10;
Execution Plan
----------------------------------------------------------
0   SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=1 Bytes=110)
1  0  HASH JOIN (Cost=4 Card=1 Bytes=110)
2  1   NESTED LOOPS (Cost=2 Card=1 Bytes=84)
3  2    TABLE ACCESS (FULL) OF 'C' (Cost=1 Card=1 Bytes=26)
4  2    TABLE ACCESS (FULL) OF 'A' (Cost=1 Card=82 Bytes=4756)
5  1   TABLE ACCESS (FULL) OF 'B' (Cost=1 Card=1 Bytes=26)

select /*+ USE_NL (A C)*/ A.col4
from C , A , B
where C.col3 = 5 and A.col1 = B.col1 and A.col2 = C.col2
and B.col3 = 10;

  我们这个查询的意思是让A、C表做NL连接,并且让A表作为内表,但是从执行计划来看,没有达到我们的目的。
Execution Plan
----------------------------------------------------------
0   SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=1 Bytes=110)
1  0  NESTED LOOPS (Cost=3 Card=1 Bytes=110)
2  1   MERGE JOIN (CARTESIAN) (Cost=2 Card=1 Bytes=52)
3  2    TABLE ACCESS (FULL) OF 'C' (Cost=1 Card=1 Bytes=26)
4  2    SORT (JOIN) (Cost=1 Card=1 Bytes=26)
5  4     TABLE ACCESS (FULL) OF 'B' (Cost=1 Card=1 Bytes=26)
6  1   TABLE ACCESS (FULL) OF 'A' (Cost=1 Card=82 Bytes=4756)

对对象进行分析后:
analyze table a compute statistics;
analyze table b compute statistics;
analyze table c compute statistics;
analyze index inx_col12A compute statistics;
select A.col4
from C , A , B
where C.col3 = 5 and A.col1 = B.col1 and A.col2 = C.col2
and B.col3 = 10;
Execution Plan
----------------------------------------------------------
0   SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=8 Bytes=336)
1  0  HASH JOIN (Cost=5 Card=8 Bytes=336)
2  1   MERGE JOIN (CARTESIAN) (Cost=3 Card=8 Bytes=64)
3  2    TABLE ACCESS (FULL) OF 'B' (Cost=1 Card=2 Bytes=8)
4  2    SORT (JOIN) (Cost=2 Card=4 Bytes=16)
5  4     TABLE ACCESS (FULL) OF 'C' (Cost=1 Card=4 Bytes=16)
6  1   TABLE ACCESS (FULL) OF 'A' (Cost=1 Card=30 Bytes=1020)

select /*+ ORDERED */ A.col4
from C , A , B
where C.col3 = 5 and A.col1 = B.col1 and A.col2 = C.col2
and B.col3 = 10;
Execution Plan
----------------------------------------------------------
0   SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=9 Bytes=378)
1  0  HASH JOIN (Cost=5 Card=9 Bytes=378)
2  1   HASH JOIN (Cost=3 Card=30 Bytes=1140)
3  2    TABLE ACCESS (FULL) OF 'C' (Cost=1 Card=4 Bytes=16)
4  2    TABLE ACCESS (FULL) OF 'A' (Cost=1 Card=30 Bytes=1020)
5  1   TABLE ACCESS (FULL) OF 'B' (Cost=1 Card=2 Bytes=8)

select /*+ ORDERED USE_NL (A C)*/ A.col4
from C , A , B
where C.col3 = 5 and A.col1 = B.col1 and A.col2 = C.col2
and B.col3 = 10;
Execution Plan
----------------------------------------------------------
0   SELECT STATEMENT Optimizer=CHOOSE (Cost=7 Card=9 Bytes=378)
1  0  HASH JOIN (Cost=7 Card=9 Bytes=378)
2  1   NESTED LOOPS (Cost=5 Card=30 Bytes=1140)
3  2    TABLE ACCESS (FULL) OF 'C' (Cost=1 Card=4 Bytes=16)
4  2    TABLE ACCESS (FULL) OF 'A' (Cost=1 Card=30 Bytes=1020)
5  1   TABLE ACCESS (FULL) OF 'B' (Cost=1 Card=2 Bytes=8)

select /*+ USE_NL (A C)*/ A.col4
from C , A , B
where C.col3 = 5 and A.col1 = B.col1 and A.col2 = C.col2
and B.col3 = 10;
Execution Plan
----------------------------------------------------------
0   SELECT STATEMENT Optimizer=CHOOSE (Cost=7 Card=9 Bytes=378)
1  0  HASH JOIN (Cost=7 Card=9 Bytes=378)
2  1   NESTED LOOPS (Cost=5 Card=30 Bytes=1140)
3  2    TABLE ACCESS (FULL) OF 'C' (Cost=1 Card=4 Bytes=16)
4  2    TABLE ACCESS (FULL) OF 'A' (Cost=1 Card=30 Bytes=1020)
5  1   TABLE ACCESS (FULL) OF 'B' (Cost=1 Card=2 Bytes=8)

select /*+ ORDERED USE_NL (A B C) */ A.col4
from C , A , B
where C.col3 = 5 and A.col1 = B.col1 and A.col2 = C.col2
and B.col3 = 10;
Execution Plan
----------------------------------------------------------
0   SELECT STATEMENT Optimizer=CHOOSE (Cost=35 Card=9 Bytes=378)
1  0  NESTED LOOPS (Cost=35 Card=9 Bytes=378)
2  1   NESTED LOOPS (Cost=5 Card=30 Bytes=1140)
3  2    TABLE ACCESS (FULL) OF 'C' (Cost=1 Card=4 Bytes=16)
4  2    TABLE ACCESS (FULL) OF 'A' (Cost=1 Card=30 Bytes=1020)
5  1   TABLE ACCESS (FULL) OF 'B' (Cost=1 Card=2 Bytes=8)

  对于这个查询我无论如何也没有得到类似下面这样的执行计划:
Execution Plan
----------------------------------------------------------
0   SELECT STATEMENT Optimizer=CHOOSE (Cost=35 Card=9 Bytes=378)
1  0  NESTED LOOPS (Cost=35 Card=9 Bytes=378)
2  1   TABLE ACCESS (FULL) OF 'B' (Cost=1 Card=2 Bytes=8)
3  1   NESTED LOOPS (Cost=5 Card=30 Bytes=1140)
4  3    TABLE ACCESS (FULL) OF 'C' (Cost=1 Card=4 Bytes=16)
5  3    TABLE ACCESS (FULL) OF 'A' (Cost=1 Card=30 Bytes=1020)

  从上面的这些例子我们可以看出:通过给语句添加HINTS,让其按照我们的意愿执行,有时是一件很困难的事情,需要不断的尝试各种不同的hints。对于USE_NL与USE_HASH提示,建议同ORDERED提示一起使用,否则不容易指定那个表为驱动表。

分享到:
评论

相关推荐

    通过分析SQL语句的执行计划优化SQL

    本文档主要介绍了与SQL调整有关的内容,涉及多个方面:SQL语句执行的过程、ORACLE优化器、表之间的关联、如何得到SQL执行计划、如何分析执行计划等内容。通过从浅入深的方式了解SQL优化的过程,使大家逐步步入SQL...

    通过分析SQL语句的执行计划优化SQL(总结)

    通过对SQL语句的执行计划进行分析,我们可以找到优化查询性能的策略,从而提高数据库系统的整体性能。这篇博客"通过分析SQL语句的执行计划优化SQL(总结)"深入探讨了这一主题,下面将对其中的主要知识点进行详细阐述...

    通过分析SQL语句的执行计划优化SQL.doc

    《通过分析SQL语句的执行计划优化SQL》 在数据库管理中,SQL语句的优化是提升系统性能的关键环节。本文主要探讨了如何通过分析SQL语句的执行计划来优化查询性能,涉及到共享SQL语句、ROWID、Recursive SQL、Row ...

    通过分析sql语句的执行计划优化sql

    本文档主要介绍与SQL调整有关的内容,内容涉及多个方面:SQL语句执行的过程、ORACLE优化器,表之间的关联,如何得到SQL执行计划,如何分析执行计划等内容,从而由浅到深的方式了解SQL优化的过程,使大家逐步步入SQL...

    通过分析SQL语句的执行计划优化SQL语句

    本文将深入探讨如何通过分析SQL语句的执行计划来实现这一目标。执行计划是数据库管理系统(DBMS)执行SQL语句的详细步骤,它揭示了数据的检索路径、使用的索引、排序和连接操作等信息。了解这些信息可以帮助我们找出...

    通过分析SQL语句的执行计划优化SQL总结.doc

    通过分析执行计划,我们可以了解数据库如何访问数据,选择何种索引,以及如何连接表等,从而找出性能瓶颈并进行优化。 1. **性能调整综述** - 调整数据库系统不仅涉及数据库管理员,还应该包括应用设计人员、开发...

    Oracle中SQL语句执行效率的查找与解决

    通过设置STATEMENT_ID,可以为SQL语句标识唯一的执行计划,便于后续比较和分析。在执行计划中,OPERATION字段描述了具体的执行步骤,如表扫描、索引扫描、合并连接等;OBJECT_NAME和OBJECT_TYPE字段指出了数据库对象...

    通过分析SQL语句的执行计划优化SQL(五)

    在SQL优化过程中,理解执行计划至关重要,因为它揭示了Oracle数据库如何执行SQL语句。...DBA可以通过分析执行计划,识别性能瓶颈,并采取相应措施,如调整索引、优化查询结构或改变连接顺序,以提升系统的整体效率。

    通过分析SQL语句的执行计划优化SQL(六)

    在SQL优化过程中,分析SQL语句的执行计划是至关重要的,因为执行计划揭示了数据库引擎如何执行查询,以及数据检索的顺序和方式。本篇主要关注通过执行计划优化SQL,特别是针对Oracle数据库。 首先,执行计划由一...

    通过分析SQL语句的执行计划优化SQL(七)

    执行计划是由数据库的查询优化器生成的,优化器在众多的存取路径中选择一条预计性能最佳的路径来执行SQL语句。本文将深入探讨SQL语句执行计划中的几个主要访问路径,包括全表扫描、通过ROWID的表存取和索引扫描。 ...

    [精华] 通过分析SQL语句的执行计划优化SQL(总结)7年DBA工作经验.docx

    【SQL语句执行计划分析与优化】 SQL语句的执行计划是数据库管理系统(DBMS)在执行查询时采用的具体步骤,对于理解SQL性能至关重要。在Oracle数据库中,优化SQL语句是DBA(数据库管理员)的一项核心任务,尤其是在...

    SQL执行计划简单分析

    在 SQL 优化中,分析执行计划是一个非常重要的步骤。执行计划可以帮助我们了解 SQL 语句的执行过程、资源消耗和性能瓶颈。Oracle 数据库提供了多种方法来查看 SQL 语句的执行计划,例如使用 PL/SQL Developer、EM ...

    SQL语句执行过程详解

    优化器确定最佳执行计划后,会将SQL语句及执行计划存储在数据高速缓存中,以便下次执行相同查询时,可以直接使用缓存的执行计划,提高处理效率。 最后是语句的执行阶段。在完成语句解析后,数据库服务器进程会真正...

Global site tag (gtag.js) - Google Analytics