• Oracle SQL Tuning Overview


    Oracle执行SQL语句的步骤如下:

    1. 用户传送要执行的SQL语句给SQL引擎

    2. SQL引擎要求查询优化器提供执行计划

    3. 查询优化取得系统统计信息、SQL语句引用对象的对象统计信息、SQL概要和构成执行环境的初始化参数

    4. 查询优化器分析SQL语句并产生执行计划

    5. 将执行计划传递给SQL引擎

    6. SQL引擎执行SQL语句

    参考:Oracle Database Performance Tuning Guide, 10g Release 2 (10.2)

    下载地址:http://www.oracle.com/pls/db102/homepage

    (一)、Developing Efficient SQL Statements

    1、Use of EXISTS versus IN for Subqueries(11-9)

          In certain circumstances, it is better to use IN rather than EXISTS. In general, if the
    selective predicate is in the subquery, then use IN. If the selective predicate is in the
    parent query, then use EXISTS.(在特定的情况下,使用IN可能比使用EXISTS会更好,一般,如果选择的过滤条件在子查询中,那么使用IN,如果,选择的过滤条件在父查询的SQL语句中,那么使用EXISTS)

    例如:EXISTS

     1 SELECT /* EXISTS EXAMPLE */
     2  E.EMPLOYEE_ID,
     3  E.FIRST_NAME,
     4  E.LAST_NAME,
     5  E.SALARY
     6   FROM EMPLOYEES E
     7  WHERE E.DEPARTMENT_ID = 80 /* NOTE 5 */
     8    AND E.JOB_ID = 'SA_REP' /* NOTE 6 */
     9    AND EXISTS (SELECT 1 /* NOTE 1 */
    10           FROM ORDERS O
    11          WHERE E.EMPLOYEE_ID = O.SALES_REP_ID); /* NOTE 2 */

        Note:
        ■ Note 1: This shows the line containing EXISTS.
        ■ Note 2: This shows the line that makes the subquery a correlated subquery.
        ■ Note 5 & 6:These are the selective predicates in the parent SQL.(代表父语句中的SQL过滤条件,在这种情况下,过滤条件出现在父SQL,所以,推荐使用EXISTS)

     】

    IN

    1 SELECT /* IN EXAMPLE */
    2  E.EMPLOYEE_ID,
    3  E.FIRST_NAME,
    4  E.LAST_NAME,
    5  E.SALARY
    6   FROM EMPLOYEES E
    7  WHERE E.EMPLOYEE_ID IN (SELECT O.SALES_REP_ID /* NOTE 4 */
    8                            FROM ORDERS O
    9                           WHERE O.CUSTOMER_ID = 144); /* NOTE 3 */

        Note:
        ■ Note 3: This shows the line where the correlated subqueries  include the highly selective predicate customer_id = number
        ■ Note 4: This indicates that an IN is being used. The subquery is no longer correlated, because the IN clause replaces the join in the subquery.(过滤条件在子查询中,所以选择使用IN)

    SQL Tuning Information Views

          This section summarizes the views that you can display to review information that has
    been gathered for tuning the SQL statements. You need DBA privileges to access these
    views.

         ■ Advisor information views, such as DBA_ADVISOR_TASKS, DBA_ADVISOR_
    FINDINGS, DBA_ADVISOR_RECOMMENDATIONS, and DBA_ADVISOR_RATIONALE
    views.
         ■ SQL tuning information views, such as DBA_SQLTUNE_STATISTICS, DBA_
    SQLTUNE_BINDS, and DBA_SQLTUNE_PLANS views.
         ■ SQL Tuning Set views, such as DBA_SQLSET, DBA_SQLSET_BINDS, DBA_
    SQLSET_STATEMENTS, and DBA_SQLSET_REFERENCES views.
         ■ Information on captured execution plans for statements in SQL Tuning Sets are
    displayed in the DBA_SQLSET_PLANS and USER_SQLSET_PLANS views.
         ■ SQL Profile information is displayed in the DBA_SQL_PROFILES view.
         ■ Advisor execution progress information is displayed in the V$ADVISOR_
    PROGRESS view.
         ■ Dynamic views containing information relevant to the SQL tuning, such as V$SQL,
    V$SQLAREA, V$SQLSTATS, and V$SQL_BINDS views.
          See Also: Oracle Database Reference for information on static data
    dictionary and dynamic views

     hint

     hints, which are optimization instructions placed in a comment in the statement.

     

     

  • 相关阅读:
    Flutter 中那么多组件,难道要都学一遍?
    【Flutter实战】自定义滚动条
    Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?
    一篇文章掌握 Python 内置 zip() 的全部内容
    Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性
    Python 3.10 版本采纳了首个 PEP,中文翻译即将推出
    Python 为什么不支持 i++ 自增语法,不提供 ++ 操作符?
    Python 为什么推荐蛇形命名法?
    Python 为什么没有 main 函数?为什么我不推荐写 main 函数?
    Python 为什么不用分号作终止符?
  • 原文地址:https://www.cnblogs.com/caroline/p/2651794.html
Copyright © 2020-2023  润新知