`

《Pro Oracle SQL》--Chapter 6--6.2 Execute Plans--之三

阅读更多

Identifying SQL Statements for Later Plan Retrieval    标示SQL语句便于之后计划检索 (page 171)
    If you want to retrieve a statement that was executed in the past, you can retrieve the SQL_ID and
CHILD_NUMBER from V$SQL as demonstrated in Listing 6-7.  To simplify finding the correct statement
identifiers, especially when I’m testing, I add a unique comment that identifies each statement I
execute.  Then, whenever I want to grab that plan from the library cache, all I have to do is query V$SQL to locate the statement text that includes the comment I used.  Listing 6-11 shows an example of this and the query I use to subsequently find the statement I want. 
    如果你想要检索一条之前执行过的语句,你可像列表6-7示例的,查询V$SQL的SQL_ID和CHILD_NUMBER列。为了容易找出正确的语句标 示,尤其在我测试时,在每条语句上加上唯一的注释。这样无论何时,我要从库缓存中取出计划,所要做的只是查询V$SQL,定位包含我所使用的注释文本的语 句。列表6-11展示了这个例子和之后我要找出想要的语句的查询。

Listing 6-11. Using a Comment to Uniquely Identify a SQL Statement   用唯一注释标示SQL语句
SQL>select /* KM-EMPTEST1 */
  2        empno, ename
  3   from emp
  4  where job = 'MANAGER' ;
      EMPNO ENAME
---------- ----------
      7566 JONES
      7698 BLAKE
      7782 CLARK
 
SQL>select sql_id, child_number, sql_text
  2  from v$sql
  3  where sql_text like '%KM-EMPTEST1%';
 
SQL_ID                     CHILD_NUMBER                       SQL_TEXT
-------------                 ------------                                    -------------------------------------------
9qu1dvthfcqsp            0                                              select /* KM-EMPTEST1 */     empno, ename  
                                                                                    from emp where job = 'MANAGER'
a7nzwn3t522mt           0                                             select sql_id, child_number, sql_text from 
                                                                                   v$sql where sql_text like '%KM-EMPTEST1%'
 
SQL>select * from table(dbms_xplan.display_cursor('9qu1dvthfcqsp',0,'ALLSTATS LAST'));
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------
SQL_ID  9qu1dvthfcqsp, child number 0
-------------------------------------
select /* KM-EMPTEST1 */     empno, ename  from emp where job =
'MANAGER'
 
Plan hash value: 3956160932

------------------------------------------------------------------------------------
| Id  | Operation                         | Name | Starts | E-Rows | A-Rows |   A-Time       | Buffers |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT        |           |      1    |              |      3      |00:00:00.01  |       8     |
|*  1 |  TABLE ACCESS FULL     | EMP    |      1    |      3       |      3      |00:00:00.01  |       8     |
------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - filter("JOB"='MANAGER')

    You’ll notice that when I queried V$SQL, two statements showed up.  One was the SELECT statement I was executing to find the entry in V$SQL and one was the query I executed.  While this set of steps gets the job done, I find it easier to automate the whole process into a single script.  In that script, I find the statement I want in V$SQL by weeding out the query I’m running to find it and also by ensuring that I find the most recently executed statement that uses my identifying comment.  Listing 6-12 shows the script I use in action.
    如你所见,我查询V$SQL展现了两条语句。一条SELECT语句是我执行查询V$SQL的,一条是我之前执行的查询。既然这套步骤有效,我发现用一个脚本自动化处理整个过程更爽。在这个脚本中,我找出想要的语句,清除查询V$SQL的那条语句,确保找到最近执行的且使用注释标示的语句。列表6-12展示了这个脚本的使用过程。

Listing 6-12. Automating Retrieval of an Execution Plan for any SQL Statement
SQL>select /* KM-EMPTEST2 */
  2         empno, ename
  3    from emp
  4   where job = 'CLERK' ;
 
     EMPNO ENAME
---------- ----------
      7369 SMITH
      7876 ADAMS
      7900 JAMES
      7934 MILLER
SQL>
SQL>get pln.sql
  1  SELECT xplan.*
  2  FROM
  3     (
  4     select max(sql_id) keep
  5            (dense_rank last order by last_active_time) sql_id
  6          , max(child_number) keep
  7            (dense_rank last order by last_active_time) child_number
  8       from v$sql
  9      where upper(sql_text) like '%&1%'
 10        and upper(sql_text) not like '%FROM V$SQL WHERE UPPER(SQL_TEXT) LIKE %'
 11      ) sqlinfo,
 12     table(DBMS_XPLAN.DISPLAY_CURSOR(sqlinfo.sql_id, sqlinfo.child_number, 'ALLSTATS
LAST')) xplan
 13* /
 
SQL>@pln KM-EMPTEST2
 
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------SQL_ID 
bn37qcafkwkt0, child number 0
-------------------------------------
select /* KM-EMPTEST2 */        empno, ename   from emp  where job =
'CLERK'
Plan hash value: 3956160932
 
------------------------------------------------------------------------------------
| Id  | Operation                                | Name | Starts | E-Rows | A-Rows        |   A-Time   | Buffers |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |           |      1   |            |      4     |00:00:00.01  |       8       |
|*  1 |  TABLE ACCESS FULL| EMP   |      1   |      3   |      4      |00:00:00.01  |       8        |
------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - filter("JOB"='CLERK')
    This script will return the execution plan associated with the most recently executed SQL
statement that matches the pattern you enter.  As I mentioned, it is easier to find a statement if you’ve made an effort to use a comment to identify it, but it will work to find any string of matching text you enter.  However, if there are multiple statements with matching text, this script will only display the most recently executed statement matching the pattern.  If you want a different statement, you’ll have to issue a query against V$SQL such as the one in Listing 6-11 and then feed the correct SQL_ID and CHILD_NUMBER to the dbms_xplan.display_cursor call.
    这个脚本将返回,关联最近执行的SQL语句的,匹配你输入(文本)模式的执行计划。正如我所提到的,如果你精心使用一注释标识一语句,你将很容易找到它。 但是它也能找出任何匹配你输入文本串(的执行计划)。然而,如果有多个语句匹配(你输入的文本),脚本只返回最近执行的匹配语句。如果你想要不同的语句, 你必须查询V$SQL,像列表6-11那样。然后填上正确的SQL_ID和CHILD_NUMBER调用 dbms_xplan.display_curor。

0
1
分享到:
评论

相关推荐

    cx_Oracle-5.1.2-11g.win32-py2.7.msi

    《Python链接Oracle数据库:cx_Oracle模块详解及安装指南》 在Python编程中,与Oracle数据库进行交互是一项常见的任务。为了实现这一目标,开发者通常会使用一个名为cx_Oracle的Python扩展模块。cx_Oracle是Python...

    Oracle---PL-SQL经典练习题.docx

    在Oracle数据库管理中,PL/SQL是一种强大的编程语言,用于处理数据库操作。以下是一些关于PL/SQL的经典练习题及其涉及的知识点: 1. **声明变量和游标**: - 在PL/SQL中,`DECLARE`语句用于声明变量。例如,`v_emp...

    Oracle_PL-SQL.rar_ORACLE PL_oracle_oracle sql_oracle 教程_pl sql

    Oracle PL/SQL是Oracle数据库系统中的重要组成部分,它是一种结合了SQL查询语言和过程化编程元素的编程语言,专门用于在Oracle环境中进行数据库管理和应用程序开发。这个“Oracle PL-SQL.rar”压缩包提供了针对初学...

    使用flink-connector-sqlserver-cdc 2.3.0把数据从SQL Server实时同步到MySQL中

    tableEnv.executeSql( "CREATE TABLE sql_server_table (" + " id INT," + " name STRING," + " ...) WITH (" + " 'connector' = 'sqlserver-cdc'," + " 'hostname' = 'your_sql_server_host'," + " 'port' ...

    cx_Oracle-6.0b2-py3.6-win32.rar

    cx_Oracle是Python的一个第三方库,它提供了Python访问Oracle数据库的接口。"cx_Oracle-6.0b2-py3.6-win32.rar"是一个针对Python 3.6和Windows 32位系统的cx_Oracle库的压缩包,包含有cx_Oracle的安装文件"cx_Oracle...

    DBD-Oracle-1.74.tar.gz

    2. **SQL语句执行**:DBD::Oracle通过DBI接口提供了一系列方法,如`prepare`、`execute`和`fetchrow_array`等,用于执行SQL语句和处理结果集。 3. **错误处理**:在使用DBD::Oracle进行数据库操作时,应始终检查...

    cx_Oracle-5.2-11g.win-amd64-py2.7.exe

    3. 执行SQL:通过游标对象的`execute()`方法执行SQL查询、DML(数据操纵语言)语句或DDL(数据定义语言)语句。 4. 处理结果:游标对象的`fetchone()`、`fetchmany()`和`fetchall()`方法用于获取查询结果。 5. 提交...

    DBA对Oracle SQL编写规范的总结

    ### DBA对Oracle SQL编写规范的总结 #### 一、引言 在Oracle数据库开发过程中,遵循一套标准化的SQL编写规范对于提升代码质量、增强可读性和可维护性至关重要。本文档由一位经验丰富的数据库管理员(DBA)撰写,旨在...

    022-preload-database-execute-sql-spring-testing

    标题"022-preload-database-execute-sql-spring-testing"暗示了这个压缩包可能包含了一个示例项目,专注于如何在Spring测试环境中预加载数据库并执行SQL语句。在深入探讨这个主题之前,我们需要了解几个关键概念: ...

    cx_Oracle-7.3.0-cp36-cp36m-win_amd64.7z

    cx_Oracle是Python编程语言中用于连接Oracle数据库的第三方库,这个压缩包“cx_Oracle-7.3.0-cp36-cp36m-win_amd64.7z”包含了该库的一个特定版本——7.3.0,适用于Python 3.6(cp36表示Python 3.6的兼容性,而cp36m...

    oracle-dynamic-SQL.rar_oracle_sql中dynamic用法

    在Oracle数据库环境中,动态SQL(Dynamic SQL)是一种强大的技术,允许在运行时构建和执行SQL语句。这种技术尤其适用于那些在程序执行前无法预知具体SQL结构的情况,例如,当查询条件根据用户输入或者程序运行状态...

    Oracle--vb代码.rar

    例如,`CommandText`属性设置SQL语句,`Execute`方法执行命令。 3. 数据集操作:VB中的Recordset对象用于存储和操作从数据库检索到的数据。它可以遍历查询结果,读取、修改和添加记录。例如,`Open`方法打开一个...

    cx_Oracle-7.3.0.tar.gz

    - 使用 `cx_Oracle.connect()` 方法可以建立数据库连接,`cursor.execute()` 可以执行 SQL 命令。 5. **新版本特性**: - `cx_Oracle-7.3.0` 相较于 `5.1.2` 版本,可能增加了对新版本 Oracle 数据库的支持,如 ...

    cx_Oracle-7.3.0-cp36-cp36m-win_amd64.txt

    6. **兼容性**:兼容多种Oracle数据库版本,能够在不同版本之间灵活切换。 ### 关键知识点五:cx_Oracle与Python版本的兼容性 根据文件名中提到的“cp36”,可以得知该版本的cx_Oracle是专为Python 3.6设计的。这...

    oracle_10g-pl-sql-programming

    ### Oracle Database 10g PL/SQL Programming #### 核心知识点概述 1. **PL/SQL基础**:包括变量、常量、数据类型、流程控制语句等。 2. **PL/SQL程序结构**:过程、函数、包、触发器、游标等。 3. **异常处理机制...

    cx_Oracle-7.1.2-cp37-cp37m-win_amd64.zip

    使用python语言连接oracle数据库的连接工具,示例如下: import cx_Oracle connection = cx_Oracle.connect("scott", "tiger", "localhost/orcl") cursor = connection.cursor() cursor.execute(""" SELECT empno...

    oracle驱动DBD-Oracle-1.27

    Oracle驱动DBD-Oracle-1.27是Perl编程语言中用于与Oracle数据库交互的模块。这个版本的DBD(Database Driver)专为Oracle数据库设计,允许开发人员使用Perl语言编写脚本来执行查询、更新和其他数据库操作。在本文中...

    oracle-function-执行动态sql

    execute immediate str_sql into tabtcn; --动态执行DDL语句

    精通SQL--结构化查询语言详解

    第1章 数据库与sql基础 1 1.1 数据库的基本概念 1 1.1.1 数据库的由来 1 1.1.2 数据库系统的概念 3 1.2 数据库系统的结构、组成及工作流程 3 1.2.1 数据库的体系结构 3 1.2.2 数据库系统的组成 4 1.2.3 ...

    Oracle PL SQL专家指南_高级PLSQL解决方案的设计与开发

    Oracle PL/SQL是Oracle数据库系统中的过程化语言,它结合了SQL的数据库操作能力和传统的编程语言特性,使得开发者能够创建复杂的数据处理逻辑和业务规则。《Oracle PL SQL专家指南:高级PLSQL解决方案的设计与开发》...

Global site tag (gtag.js) - Google Analytics