`
weishaoxiang
  • 浏览: 96550 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

ORACLE学习笔记系列(1)如何使用SQLPLUS分析SQL语句

 
阅读更多

 

 如何使用SQLPLUS分析SQL语句

        利用set autotrace来查看执行计划

        在sqlplus下执行:EXPLAIN PLAN FOR sql语句

 

方法一:autotrace

 

1、  connect  sys/密码 as  sysdba,在sys用户下运行

SQL>@E:\app\product\11.2.0\dbhome_1\sqlplus\admin

 

这段sql的实际内容如下:

set echo on
drop role plustrace;
create role plustrace;
grant select on v_$sesstat to plustrace;
grant select on v_$statname to plustrace;
grant select on v_$mystat to plustrace;
grant plustrace to dba with admin option;
set echo off

 

 

以上产生plustrace角色,然后在sys用户下把此角色赋予一般用户

 

SQL>grant PLUSTRACE to用户名;

 

2、然后在当前用户运行

SQL>@E:\app\product\11.2.0\dbhome_1\RDBMS\ADMIN\utlxplan.sql

它会创建一个plan_table,用来存储分析SQL语句的结果。

 

实际执行的是如下语句:

create table PLAN_TABLE (
        statement_id       varchar2(30),
        plan_id            number,
        timestamp          date,
        remarks            varchar2(4000),
        operation          varchar2(30),
        options            varchar2(255),
        object_node        varchar2(128),
        object_owner       varchar2(30),
        object_name        varchar2(30),
        object_alias       varchar2(65),
        object_instance    numeric,
        object_type        varchar2(30),
        optimizer          varchar2(255),
        search_columns     number,
        id                 numeric,
        parent_id          numeric,
        depth              numeric,
        position           numeric,
        cost               numeric,
        cardinality        numeric,
        bytes              numeric,
        other_tag          varchar2(255),
        partition_start    varchar2(255),
        partition_stop     varchar2(255),
        partition_id       numeric,
        other              long,
        distribution       varchar2(30),
        cpu_cost           numeric,
        io_cost            numeric,
        temp_space         numeric,
        access_predicates  varchar2(4000),
        filter_predicates  varchar2(4000),
        projection         varchar2(4000),
        time               numeric,
        qblock_name        varchar2(30),
        other_xml          clob
);

 

 

3、SQL/PLUS的窗口运行以下命令

 

settimeon;               (说明:打开时间显示)(可选)

set autotrace on;           (说明:打开自动分析统计,并显示SQL语句的运行结果)

set autotrace traceonly;    (说明:打开自动分析统计,不显示SQL语句的运行结果)

 

4、接下来就运行需要查看执行计划的SQL语句,看到其分析统计结果了。一般来讲,SQL语句应该避免对大表的全表扫描。

 

5、关闭以上功能,在SQL/PLUS的窗口运行以下命令

 

settimeoff;                      (说明:关闭时间显示)

set autotrace off;      

 

附:相关的set autotrace命令:

SET AUTOTRACE OFF

No AUTOTRACE reportis generated.

SET AUTOTRACE ONEXPLAIN

shows onlythe optimizer execution path.

SET AUTOTRACE ON

STATISTICS shows onlytheSQLstatement execution statistics.

SET AUTOTRACE ON

includes boththe optimizer execution pathandtheSQLstatement execution statistics.

SET AUTOTRACE TRACEONLY

LikeSET AUTOTRACE ON, but suppresses the printing oftheusers query output,if any.

 

说明:如果执行了set autotrace on语句,接下来的查询、插入、更新、删除语句就会显示执行计划和有用的统计信息,直到执行set autotrace off语句。

 

利用set autotrace来查看执行计划

 

设置Autotrace的命令。

分别在执行sql前设置set autotrace 的不同参数,得到不同的想观察的效果

用法:SET AUTOT[RACE] {OFF|ON|TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]

--关闭跟踪执行计划和统计信息功能(默认关闭)。
SQL> set autotrace off;

--执行计划和统计信息都显示
SQL> set autotrace on ;

--只显示执行计划和统计信息,不显示sql执行结果。
SQL> set autotrace  traceonly;

--只显示执行计划
SQL> set autotrace on explain;

--只显示统计信息
SQL> set autotrace on  statistics;

 

 

 

使用autotrace功能时,oracle启用了两个session

一个用来执行SQL。另一个用来记录执行计划和输出结果。

 

示例:

SQL>set autotrace traceexp;

SQL>set linesize 150;

SQL>select*from echo where object_id=1000;

 

 

方法二: EXPLAIN PLAN FOR sql

 

1、sqlplus下执行:EXPLAINPLANFOR sql语句,执行后会提示已经解释。

2、然后执行如下查询,查询出执行计划

 

例子:

SQL> clear screen

SQL> SET LINESIZE 10000

SQL> explain plan FOR SELECT * FROM USER_TABLES;

已解释。

SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------
Plan hash value: 4102440123

----------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                   |               |  2443 |  5604K|   730   (7)| 00:00:09 |
|*  1 |  HASH JOIN                         |               |  2443 |  5604K|   730   (7)| 00:00:09 |
|   2 |   FIXED TABLE FULL                 | X$KSPPCV      |   100 |   196K|     0   (0)| 00:00:01 |
|   3 |   MERGE JOIN CARTESIAN             |               |  2443 |   796K|   729   (7)| 00:00:09 |
|*  4 |    HASH JOIN RIGHT OUTER           |               |  2443 |   665K|   686   (2)| 00:00:09 |
|   5 |     TABLE ACCESS FULL              | SEG$          |  6400 |   281K|    52   (0)| 00:00:01 |

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------
|*  6 |     HASH JOIN RIGHT OUTER          |               |  2392 |   546K|   633   (1)| 00:00:08 |
|   7 |      TABLE ACCESS FULL             | USER$         |    95 |  1615 |     3   (0)| 00:00:01 |
|*  8 |      HASH JOIN RIGHT OUTER         |               |  2392 |   506K|   630   (1)| 00:00:08 |
|   9 |       TABLE ACCESS FULL            | DEFERRED_STG$ |  2781 | 69525 |     7   (0)| 00:00:01 |
|* 10 |       HASH JOIN OUTER              |               |  2392 |   448K|   622   (1)| 00:00:08 |
|  11 |        NESTED LOOPS OUTER          |               |  2392 |   429K|   563   (1)| 00:00:07 |
|* 12 |         HASH JOIN                  |               |  2392 |   359K|   361   (2)| 00:00:05 |
|  13 |          TABLE ACCESS FULL         | TS$           |     8 |   160 |     5   (0)| 00:00:01 |
|  14 |          NESTED LOOPS              |               |  2392 |   313K|   356   (2)| 00:00:05 |
|* 15 |           TABLE ACCESS FULL        | OBJ$          |  2392 | 86112 |   253   (2)| 00:00:04 |
|* 16 |           TABLE ACCESS CLUSTER     | TAB$          |     1 |    98 |     1   (0)| 00:00:01 |

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------
|* 17 |            INDEX UNIQUE SCAN       | I_OBJ#        |     1 |       |     0   (0)| 00:00:01 |
|  18 |         TABLE ACCESS BY INDEX ROWID| OBJ$          |     1 |    30 |     2   (0)| 00:00:01 |
|* 19 |          INDEX RANGE SCAN          | I_OBJ1        |     1 |       |     1   (0)| 00:00:01 |
|  20 |        INDEX FAST FULL SCAN        | I_OBJ1        | 74188 |   579K|    58   (0)| 00:00:01 |
|  21 |    BUFFER SORT                     |               |     1 |    55 |   677   (8)| 00:00:09 |
|* 22 |     FIXED TABLE FULL               | X$KSPPI       |     1 |    55 |     0   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------


PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------
   1 - access("KSPPI"."INDX"="KSPPCV"."INDX")
   4 - access("T"."FILE#"="S"."FILE#"(+) AND "T"."BLOCK#"="S"."BLOCK#"(+) AND
              "T"."TS#"="S"."TS#"(+))
   6 - access("CX"."OWNER#"="CU"."USER#"(+))
   8 - access("T"."OBJ#"="DS"."OBJ#"(+))
  10 - access("T"."DATAOBJ#"="CX"."OBJ#"(+))
  12 - access("T"."TS#"="TS"."TS#")
  15 - filter("O"."OWNER#"=USERENV('SCHEMAID') AND BITAND("O"."FLAGS",128)=0)
  16 - filter(BITAND("T"."PROPERTY",1)=0)
  17 - access("O"."OBJ#"="T"."OBJ#")
  19 - access("T"."BOBJ#"="CO"."OBJ#"(+))

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------
  22 - filter("KSPPI"."KSPPINM"='_dml_monitoring_enabled')

已选择45行。

SQL>

 
注:除了上面的,还有一个很有用的函数dbms_xplan.display_awr(sql_id ,null,null,'ALL');这个可以结合AWR报告中的SQL语句的SQL_ID来获得历史语句的执行计划,然后通过视图 dba_hist_sqlbind 找到语句对应的绑定变量值。

 

分享到:
评论

相关推荐

    Oracle学习笔记 PDF

    ### Oracle学习笔记知识点详解 #### 一、Oracle简介 Oracle是一家知名的软件公司,以其数据库管理系统闻名全球。该公司成立于1977年,总部位于美国加利福尼亚州。Oracle不仅提供数据库解决方案,还涉及中间件、...

    oracle的sqlplus学习笔记.docx

    Oracle SQLPlus 学习笔记 Oracle SQLPlus 是 Oracle 数据库管理系统中的一个命令行工具,用于交互式地执行 SQL 语句和 PL/SQL 块。下面是 SQLPlus 的一些常用命令和使用方法: 环境变量设置 在使用 SQLPlus 之前...

    Oracle 10g 学习笔记

    │ ORACLE学习笔记(二)SQLPLUS基础 - lvhuiqing的专栏 - CSDN博客.mht.lnk │ oracle技巧.txt │ ORACLE的索引和约束详解 - Oracle10g - 沪城篱笆.mht │ oracle里常用命令 - Oracle - 51CTO技术论坛_中国领先的IT...

    Oracle学习笔记1.docx

    Oracle 学习笔记 1 本文档涵盖了 Oracle 学习的基础知识,包括客户端工具、用户管理、表结构、SELECT 语句、DISTINCT 操作、WHERE 子句、ORDER BY 子句和 SQL 函数等内容。 客户端工具 Oracle 提供了多种客户端...

    oracle学习笔记下载

    ### Oracle 学习笔记知识点概览 #### 一、Oracle 数据库系统参数查询与管理 在 Oracle 数据库的学习过程中,了解如何查看和管理数据库的系统参数是非常重要的。这些参数直接影响着数据库的性能和稳定性。 ##### ...

    ORACLE经典学习笔记

    ### ORACLE经典学习笔记知识点概览 #### 第一章 ORACLE 命令 本章节主要介绍了Oracle数据库中常用的命令及其使用方法。 1. **查看参数文件**: `Desc v$parameter` - 这个命令用于查看Oracle的参数文件信息,通过...

    oracle 经典学习笔记

    4. SQL语句使用: - 熟悉基本的SELECT语句,可以进行数据查询。 - 进行数学表达式的计算,例如计算年薪(sal*12)。 - 使用别名(year_sal)给查询结果的列进行重命名。 - 理解sysdate关键字用于获取当前系统日期和...

    达内Oracle学习笔记

    总之,达内科技的Oracle学习笔记不仅涵盖了Oracle数据库的基础概念和操作,还提供了SQLPlus等工具的实用技巧,是学习和掌握Oracle数据库不可多得的资源。对于想要深入了解和应用Oracle的IT专业人士来说,这些知识将...

    韩顺平2011oracle学习笔记

    韩顺平2011年的Oracle学习笔记主要涵盖了Oracle的基本使用方法,包括一系列的基本命令。 1. **连接命令**:在Oracle中,我们通常使用SQL*Plus作为客户端工具连接到数据库服务器。连接命令是`sqlplus [username/...

    Oracle SQL笔记.pdf

    根据提供的文件信息,我们可以归纳出一系列重要的...这些知识点覆盖了SQL的基础概念、查询语句、函数使用、多表查询、数据操纵、数据库设计、约束管理、事务控制等多个方面,对于学习和掌握Oracle SQL具有重要意义。

    oracle学习笔记--言简意赅

    ### Oracle学习笔记精要 ...以上是Oracle学习笔记中的关键知识点总结,涵盖了SQLPLUS的基本命令、SQL语句的结构、SELECT语句的使用技巧等多个方面,旨在帮助初学者快速掌握Oracle数据库的基础操作和查询技术。

    Oracle学习笔记.doc

    ### Oracle学习笔记知识点详解 #### 一、SQL概述与Oracle...以上是关于Oracle学习笔记中的主要知识点详细介绍,涵盖了SQL的基础概念、基本操作、高级查询技巧等多个方面,帮助读者全面掌握Oracle数据库的使用方法。

    韩顺平oracle学习笔记

    韩顺平oracle学习笔记 第0讲:如何学习oracle 一、如何学习oracle Oracle目前最流行的数据库之一,功能强大,性能卓越。学习oracle需要具备一定基础: 1.学习过一门编程语言(如:java ,c) 2.最好学习过一门别的...

    oracle个人学习笔记

    ### Oracle个人学习笔记知识点梳理 #### 一、Oracle 用户与权限管理 **1. 创建用户** - 使用管理员账户(如 `sys` 或 `system`)登录后,可以通过以下命令创建新用户: ```sql SQL> create user zhangsan ...

    Oracle学习笔记_(PDF版)

    ### Oracle学习笔记要点 #### 一、SQL Plus的使用方法 - **命令行方式**: 在命令行中直接输入 `sqlplus` 命令,并随后输入用户名和密码。 - **客户端方式**: 使用Oracle提供的SQL Plus客户端工具进行登录。 - **Web...

    Oracle DBA学习笔记

    Oracle DBA学习笔记中包含了关于Oracle数据库的基础知识和操作技能,内容涵盖了Oracle的使用、Select基本操作和sqlplus命令等方面。 首先,Oracle数据库笔记提供了登录Oracle数据库的方法,包括使用管理员账户登录...

    Oracle学习笔记——day01

    在Oracle学习的第一天,我们主要关注了SQL语句,这是与Oracle交互的基础。SQL主要包括三种类型的语言:DML(数据操作语言)、DDL(数据定义语言)和DCL(数据控制语言)。 1. **DML(数据操作语言)**:DML主要用于...

    oracle 学习笔记.doc

    查看所有表的SQL语句可以这样写:`select 'select * from' || table_name || ';' from user_tables;`,并利用`spool`命令将结果保存到文件,便于生成动态脚本。例如,`spool test.sql`将后续的输出保存到test.sql...

Global site tag (gtag.js) - Google Analytics