Oracle 是分区表,但条件不带分区条件的SQL

Posted 奋斗的小鸟_oracle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle 是分区表,但条件不带分区条件的SQL相关的知识,希望对你有一定的参考价值。

Oracle  是分区表,但条件不带分区条件的SQL(筛选条件:当天,查询超过1s,某些SQL类型)
/* 查找是分区表,但条件不带分区的SQL COMMAND_TYPE: 查找的视图:V$SQLCOMMAND 2:INSERT 3:SELECT 6:UPDATE 7:DELETE 189:MERGE 注释: 先通过SQL执行计划视图中查询OPERATION||' '||OPTIONS=TABLE ACCESS FULL 对应ID上一层是PARTITION RANGE ALL 的SQL_ID,再查找详细的SQL语句(+筛选条件) */
SELECT  S.SQL_TEXT,        S.SQL_FULLTEXT,        S.SQL_ID,         ROUND  (ELAPSED_TIME /  1000000  / (  CASE                 WHEN  (EXECUTIONS =  0  OR   NVL  (EXECUTIONS,  1  ) =  1 THEN                  1                 ELSE                 EXECUTIONS               END  ),               2  ) "执行时间'S'",        P1.OBJECT_OWNER,        P1.OBJECT_NAME,        P1.OPERATION,        S.LAST_LOAD_TIME,         --P1.P_PLAN_HASH_VALUE,        S.PLAN_HASH_VALUE    FROM  V$SQLAREA S    JOIN  (  SELECT   DISTINCT  /*去重是因为 1SQL多次调用,执行计划一样  不去重会出现多值 最终SQL会出现多个*/                         A.SQL_ID,                         A.OBJECT_OWNER,                         A.OBJECT_NAME,                         P.OPERATION            FROM  ( SELECT  P.SQL_ID,                        P.OBJECT_OWNER,                        P.OBJECT_NAME,                        P.PLAN_HASH_VALUE,                        P.OPERATION ||  ' '  || P.OPTIONS "OPERATION",                        P.ID,  --不带ID 若一个SQL 2个分区表且2个分区表都没有加分区条件 会产生笛卡尔集                        P.HASH_VALUE,                        P.PLAN_HASH_VALUE P_PLAN_HASH_VALUE                    FROM  V$SQL_PLAN P                   WHERE  P.OPERATION ||  ' '  || P.OPTIONS =                         'PARTITION RANGE ALL'  ) P  --查找执行计划是‘PARTITION RANGE ALL’ 分区全扫 ,而不是‘PARTITION RANGE SINGLE’部分分区扫描            JOIN  ( SELECT  SQL_ID,                       P.OBJECT_OWNER,                       P.OBJECT_NAME,                       P.PLAN_HASH_VALUE,                       P.OPERATION ||  ' '  || P.OPTIONS,                       P.ID -  1   ID  --执行计划 显示‘PARTITION RANGE ALL’在‘TABLE ACCESS FULL’ 下一行 也就是id-1和分区全扫的id,全部关联后才能过滤出真正的表                       P.HASH_VALUE                   FROM  V$SQL_PLAN P                  WHERE  (P.OBJECT_NAME  IN                       (  SELECT  PT.TABLE_NAME  FROM  USER_PART_TABLES PT))                    AND  P.OPERATION ||  ' '  || P.OPTIONS =  'TABLE ACCESS FULL'   --查找执行计划是‘TABLE ACCESS FULL’ 表全扫...                    AND  P.OBJECT_OWNER =  '&USERNAME'                    AND  TO_CHAR(P.TIMESTAMP,  'YYYY-MM-DD'  ) =                       TO_CHAR(  SYSDATE   'YYYY-MM-DD'  )) A              ON  P.SQL_ID = A.SQL_ID             AND  P.ID = A.ID  --2个关联条件最终得出 是分区表但没带分区条件的表/sql_id...等         ) P1      ON  S.SQL_ID = P1.SQL_ID    WHERE   ROUND  (ELAPSED_TIME /  1000000  / (  CASE                 WHEN  (EXECUTIONS =  0  OR   NVL  (EXECUTIONS,  1  ) =  1 THEN                  1                 ELSE                 EXECUTIONS               END  ),               2  ) >  1  --100 0000微秒=1S     AND  S.PARSING_SCHEMA_NAME =  '&USERNAME'     AND  TO_CHAR(S.LAST_LOAD_TIME,  'YYYY-DD-MM'  ) =        TO_CHAR(  SYSDATE   'YYYY-DD-MM'  )     AND  S.COMMAND_TYPE  IN  ( 2  3 5   6  189 )    ORDER   BY  S.ELAPSED_TIME  DESC  ;

祝好~

以上是关于Oracle 是分区表,但条件不带分区条件的SQL的主要内容,如果未能解决你的问题,请参考以下文章

oracle 中查询按某种要求条件查询结果,如何能够提高效率?

Oracle基础 表分区

oracle收集统计信息无法开并行

oracle删除分区还在编辑表中显示吗为啥

PL/SQ连接oracle,L 新建表的时候, virtual那一列是啥意思

Oracle12c:自动分区表