通过_optimizer_rownum_pred_based_fkr优化一条sql语句

一生产库,cpu利用率达到95%以上,通过分析发现是由一条sql语句影响,通过设置参数 _optimizer_rownum_pred_based_fkr来解决


------采样时间看数据库负载很高


 

-------sharepool 占用了大量的内存(说明数据里存在的硬解析较高,存大大量的字面值)


 


 

--------top5事件发现PX DEQ CREDIT SEND BLKD很高

 


Note:

等待事件"PX Deq Credit: need buffer"  和  "PX Deq Credit: send blkd"的发生,是在部分查询时,数据或信息通过另外的进程被改变了。至少有3个不同的主要问题可以导致这种等待事件。第一:当有大量的数据和信息在并发线程中被改变,我们可以看到很高的等待事件。导致这个原因可能是由于执行计划不对或者并发设置不对。第二:CPU资源或者接口上有问题。例如,一个CPU资源达到100%,进程就被CPU控制而不能快速传递数据。第三:并发查询被hang住了,因为一个进程出现PX Deq Credit: need buffer等待事件

 

 

 

---------从如下整体的统计信息来看,数据库的大部分时间都化在sql execute elapsed time上。

Statistic Name

Time (s)

% of DB Time

sql execute elapsed time

143,382.44

91.49

DB CPU

82,112.02

52.39

parse time elapsed

3,620.27

2.31

hard parse elapsed time

1,429.93

0.91

connection management call elapsed time

20.06

0.01

PL/SQL execution elapsed time

16.67

0.01

repeated bind elapsed time

3.19

0.00

sequence load elapsed time

2.27

0.00

hard parse (sharing criteria) elapsed time

1.03

0.00

PL/SQL compilation elapsed time

0.86

0.00

failed parse elapsed time

0.51

0.00

hard parse (bind mismatch) elapsed time

0.04

0.00

DB time

156,726.52

 

background elapsed time

3,882.40

 

background cpu time

356.82

 

 

 

 

---------从wait class上看时间都化在cpu的时间上。

Wait Class

·         s - second

·         cs - centisecond - 100th of a second

·         ms - millisecond - 1000th of a second

·         us - microsecond - 1000000th of a second

·         ordered by wait time desc, waits desc

·         %Timeouts: value of 0 indicates value was < .5%. Value of null is truly 0

Wait Class

Waits

%Time -outs

Total Wait Time (s)

Avg wait (ms)

%Total Call Time

CPU time

 

 

82,112

 

52.39

User I/O

3,296,101

0

32,057

10

20.45

Other

2,357,592

5

18,260

8

11.65

Network

18,175,262

 

7,402

0

4.72

Commit

1,199,873

1

7,372

6

4.70

System I/O

1,754,920

 

4,076

2

2.60

Application

2,017,828

 

1,317

1

0.84

Concurrency

102,800

0

726

7

0.46

Configuration

202

4

7

34

0.00

 

 

 

 

-------查看当时的等待事件


 

 

-------查看事latch: cache buffers chains对应的sql语句大部分都类似的语句

0wnbhwrfvgktk
SELECT BILLFLOW_ID, PACKAGE_ID, FILE_CNT, BILLING_CYCLE_ID FROM (select * from B_FILE_PACKAGE ORDER BY CREATED_DATE) a where not exists (select * from B_PACKAGE_STATE_TRANS b where b.package_id = a.package_id and b.process_id =850) and A.STATE = 'RDY' AND BILLFLOW_ID in (1) and rownum <:RUWNUM

1qwx3mq126jn8
SELECT BILLFLOW_ID, PACKAGE_ID, FILE_CNT, BILLING_CYCLE_ID FROM (select * from B_FILE_PACKAGE ORDER BY CREATED_DATE) a where not exists (select * from B_PACKAGE_STATE_TRANS b where b.package_id = a.package_id and b.process_id =867) and A.STATE = 'RDY' AND BILLFLOW_ID in (21) and rownum <:RUWNUM

0cwbfbvucu2hs
SELECT BILLFLOW_ID, PACKAGE_ID, FILE_CNT, BILLING_CYCLE_ID FROM (select * from B_FILE_PACKAGE ORDER BY CREATED_DATE) a where not exists (select * from B_PACKAGE_STATE_TRANS b where b.package_id = a.package_id and b.process_id =866) and A.STATE = 'RDY' AND BILLFLOW_ID in (21) and rownum <:RUWNUM

--------类似的语句很多,基本相同,在此挑出一条重点分析(0wnbhwrfvgktk)

/oraclelog/tjbill/udump/tjbill_ora_15118.log


Note:

从上述得知,此语句时间大部分都花提取数据阶段。

 

----------此条语句的执行计划

 

 

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

SQL_ID  0wnbhwrfvgktk, child number 1

-------------------------------------

SELECT BILLFLOW_ID, PACKAGE_ID, FILE_CNT, BILLING_CYCLE_ID                      FROM (select * from

B_FILE_PACKAGE  ORDER BY CREATED_DATE) a                      where not exists

(select * from B_PACKAGE_STATE_TRANS b where b.package_id = a.package_id and b.process_id =850)

              and A.STATE = 'RDY'                      AND BILLFLOW_ID in (1) and rownum <:RUWNUM

 

Plan hash value: 2172617882

 

---------------------------------------------------------------------------------------------------------------

| Id  | Operation                     | Name                  | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |

 

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT              |                       |       |       |       |  5490 (100)|          |

|*  1 |  COUNT STOPKEY                |                       |       |       |       |            |          |

|   2 |   NESTED LOOPS ANTI           |                       |   999 | 54945 |       |  5490   (1)| 00:01:06 |

|   3 |    VIEW                       |                       | 10654 |   468K|       |   159   (2)| 00:00:02 |

|   4 |     SORT ORDER BY             |                       |  5790K|   242M|   400M| 86113   (2)| 00:17:14 |

|*  5 |      TABLE ACCESS FULL        | B_FILE_PACKAGE        |  5790K|   242M|       | 21064   (3)| 00:04:13 |

|*  6 |    TABLE ACCESS BY INDEX ROWID| B_PACKAGE_STATE_TRANS |  5185K|    49M|       |     1   (0)| 00:00:01 |

|*  7 |     INDEX RANGE SCAN          | IDX_B_PAG_STAT_TRANS  |     2 |       |       |     1   (0)| 00:00:01 |

---------------------------------------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

 

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------

 

   1 - filter(ROWNUM<:RUWNUM)

   5 - filter(("B_FILE_PACKAGE"."BILLFLOW_ID"=1 AND "B_FILE_PACKAGE"."STATE"='RDY'))

   6 - filter("B"."PROCESS_ID"=850)

   7 - access("B"."PACKAGE_ID"="A"."PACKAGE_ID")

 

Column Projection Information (identified by operation id):

-----------------------------------------------------------

 

   1 - "PACKAGE_ID"[NUMBER,22], "FILE_CNT"[NUMBER,22], "BILLFLOW_ID"[NUMBER,22],

 

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

       "BILLING_CYCLE_ID"[NUMBER,22]

   2 - "PACKAGE_ID"[NUMBER,22], "FILE_CNT"[NUMBER,22], "BILLFLOW_ID"[NUMBER,22],

       "BILLING_CYCLE_ID"[NUMBER,22]

   3 - "PACKAGE_ID"[NUMBER,22], "FILE_CNT"[NUMBER,22], "BILLFLOW_ID"[NUMBER,22],

       "BILLING_CYCLE_ID"[NUMBER,22]

   4 - (#keys=1) "B_FILE_PACKAGE"."CREATED_DATE"[DATE,7], "B_FILE_PACKAGE"."PACKAGE_ID"[NUMBER,22],

       "B_FILE_PACKAGE"."FILE_CNT"[NUMBER,22], "B_FILE_PACKAGE"."BILLFLOW_ID"[NUMBER,22],

       "B_FILE_PACKAGE"."BILLING_CYCLE_ID"[NUMBER,22]

   5 - "B_FILE_PACKAGE"."PACKAGE_ID"[NUMBER,22], "B_FILE_PACKAGE"."FILE_CNT"[NUMBER,22],

       "B_FILE_PACKAGE"."BILLFLOW_ID"[NUMBER,22], "B_FILE_PACKAGE"."BILLING_CYCLE_ID"[NUMBER,22],

       "B_FILE_PACKAGE"."CREATED_DATE"[DATE,7]

 

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

   7 - "B".ROWID[ROWID,10]

 

 

----------查看BILL.B_FILE_PACKAGE表的列的索引情况

 

select index_owner,index_name,table_name,column_name,column_position,descend from dba_ind_columns where table_name='B_FILE_PACKAGE' and INDEX_OWNER='BILL';

 

 

INDEX_OWNER     INDEX_NAME                     TABLE_NAME                     COLUMN_NAME               COLUMN_POSITION DESC

--------------- ------------------------------ ------------------------------ ------------------------- --------------- ----

BILL            IDX_FLOW_FLAG_PACKAGE          B_FILE_PACKAGE                 BILLFLOW_ID                             1 ASC

BILL            IDX_FLOW_FLAG_PACKAGE          B_FILE_PACKAGE                 BILLDB_FLAG                             2 ASC

BILL            IDX_FLOW_FLAG_PACKAGE          B_FILE_PACKAGE                 PACKAGE_ID                              3 ASC

BILL            IDX_FLOWID_STATE               B_FILE_PACKAGE                 BILLFLOW_ID                             1 ASC

BILL            IDX_FLOWID_STATE_DATE          B_FILE_PACKAGE                 BILLFLOW_ID                             1 ASC

BILL            IDX_FLOWID_STATE_DATE          B_FILE_PACKAGE                 STATE                                   2 ASC

BILL            IDX_FLOWID_STATE_DATE          B_FILE_PACKAGE                 CREATED_DATE                            3 ASC

BILL            IDX_FILE_PAK_ID                B_FILE_PACKAGE                 PACKAGE_ID                              1 ASC

BILL            IDX_FLOWID_STATE               B_FILE_PACKAGE                 STATE                                   2 ASC

 

--------------10046--------------------

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

 

SQL> oradebug setmypid;

Statement processed.

SQL> oradebug event 10046 trace name context forever,level 12;

Statement processed.

SQL> set timing on

SQL> SELECT BILLFLOW_ID, PACKAGE_ID, FILE_CNT, BILLING_CYCLE_ID

  2  FROM

  3   (select * from bill.B_FILE_PACKAGE  ORDER BY CREATED_DATE) a                     

  4    where not exists                      (select * from bill.B_PACKAGE_STATE_TRANS

  5    b where b.package_id = a.package_id and b.process_id =850)                 

  6        and A.STATE = 'RDY'                      AND BILLFLOW_ID in (1) and

  7    rownum <1000;

 

 

 

BILLFLOW_ID PACKAGE_ID   FILE_CNT BILLING_CYCLE_ID

----------- ---------- ---------- ----------------

          1   81669818        369            11309

          1   81669819          6            11309

          1   81669820         18                0

          1   81669821         30            11309

          1   81669822         15            11309

          1   81669823          1                0

          1   81669824          2            11309

          1   81669825          1                0

          1   81669826          1                0

          1   81669827          1                0

          1   81669828          2            11309

 

BILLFLOW_ID PACKAGE_ID   FILE_CNT BILLING_CYCLE_ID

----------- ---------- ---------- ----------------

          1   81669829          1                0

          1   81669830          1                0

          1   81669831          2                0

          1   81669832          1                0

          1   81669833          1                0

          1   81669834          1                0

          1   81669836          1                0

          1   81669835          2            11309

          1   81669837          1                0

          1   81669838          1                0

          1   81669839          1                0

 

BILLFLOW_ID PACKAGE_ID   FILE_CNT BILLING_CYCLE_ID

----------- ---------- ---------- ----------------

          1   81669840          1                0

          1   81669841          1                0

          1   81669842          1                0

          1   81669843          1                0

          1   81669844          1                0

          1   81669845          1                0

          1   81669846          1                0

          1   81669847          1                0

          1   81669848          1                0

          1   81669849         42            11309

          1   81669850          8            11309

 

BILLFLOW_ID PACKAGE_ID   FILE_CNT BILLING_CYCLE_ID

----------- ---------- ---------- ----------------

          1   81669851          1            11309

          1   81669852        312            11309

          1   81669853          7            11309

          1   81669854          1            11309

          1   81669855          5            11309

          1   81669857          6            11309

          1   81669856        173            11309

 

40 rows selected.

 

Elapsed: 00:02:51.82   ======》现在的消耗时间

 


 

 

 

Note:

没关闭_ optimizer_rownum_pred_based_fkr之前执行计划走的是nested loops ,主要时间都消耗在nested loops上time=167s左右。

 

 

 

===================================================================================================================

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

 

SQL> alter session set "_optimizer_rownum_pred_based_fkr"=false;

 

Session altered.

 

SQL> set timing on

SQL> oradebug setmypid;

Statement processed.

SQL> oradebug event 10046 trace name context forever,level 12;

Statement processed.

SQL> SELECT BILLFLOW_ID, PACKAGE_ID, FILE_CNT, BILLING_CYCLE_ID

FROM

 (select * from bill.B_FILE_PACKAGE  ORDER BY CREATED_DATE) a                     

  where not exists                      (select * from bill.B_PACKAGE_STATE_TRANS

  b where b.package_id = a.package_id and b.process_id =850)                 

  2    3    4    5    6        and A.STATE = 'RDY'                      AND BILLFLOW_ID in (1) and

  7    rownum <1000;

 

BILLFLOW_ID PACKAGE_ID   FILE_CNT BILLING_CYCLE_ID

----------- ---------- ---------- ----------------

          1   81668860          9            11309

          1   81668859        332            11309

          1   81668861        305            11309

          1   81668862          5            11309

          1   81668863          1            11309

          1   81668864         78            11309

          1   81668865          7            11309

          1   81668866          3            11309

          1   81668867         22            11309

          1   81668868         22            11309

          1   81668869          4                0

 

BILLFLOW_ID PACKAGE_ID   FILE_CNT BILLING_CYCLE_ID

----------- ---------- ---------- ----------------

          1   81668870         18                0

          1   81668871         33            11309

          1   81668872          1                0

          1   81668873          2            11309

          1   81668874          1                0

          1   81668875          2            11309

          1   81668876          1                0

          1   81668878          1                0

          1   81668877          2            11309

          1   81668879          1                0

          1   81668880          1                0

 

BILLFLOW_ID PACKAGE_ID   FILE_CNT BILLING_CYCLE_ID

----------- ---------- ---------- ----------------

          1   81668881          1                0

          1   81668882          1                0

          1   81668884          1                0

          1   81668883          2            11309

          1   81668885          1                0

          1   81668886          3                0

          1   81668888          1                0

          1   81668887          1                0

          1   81668889          2            11309

          1   81668890          1                0

          1   81668891          2            11309

 

BILLFLOW_ID PACKAGE_ID   FILE_CNT BILLING_CYCLE_ID

----------- ---------- ---------- ----------------

          1   81668892          1                0

          1   81668893          3                0

          1   81668894          3            11309

          1   81668895          1                0

          1   81668896          4            11309

          1   81668897          6            11309

          1   81668898          3            11309

          1   81668899          3            11309

          1   81669100          1                0

          1   81669101          2            11309

          1   81669102          5            11309

 

BILLFLOW_ID PACKAGE_ID   FILE_CNT BILLING_CYCLE_ID

----------- ---------- ---------- ----------------

          1   81669103          3            11309

          1   81669105          3            11309

          1   81669104          2            11309

          1   81669106          2                0

          1   81669107          3                0

          1   81669108          8            11309

          1   81669109         49            11309

          1   81669110          1            11309

          1   81669111          1            11309

          1   81669112         30            11309

          1   81669113          3            11309

 

55 rows selected.

 

Elapsed: 00:00:40.30  ====》执行alter session set "_optimizer_rownum_pred_based_fkr"=false;后的消耗时间

SQL> oradebug event 10046 trace name oradebug event 10046 trace name context off;

 

SQL>

SQL> oradebug event 10046 trace name context off;

Statement processed.

SQL>

SQL>

SQL> oradebug tracefile_name

/oraclelog/tjbill/udump/tjbill_ora_10904.trc

SQL>

 


 

Note:

    关闭_optimizer_rownum_pred_based_fkr之后执行计划走的是hash join (最佳的)消耗时间39s 左右。消耗时间降低了167s/39s=4.2倍左右。

+ buffer gets reduced from 18455275 to 247494
+ elapsed time reduced from 167 to 39 seconds.

 

临时解决方法

 

alter system set "_optimizer_rownum_pred_based_fkr"=false;

 


SQLT (SQLTXPLAIN) - Tool that helps to diagnose a SQL statement performing poorly or one that produces wrong results (Doc ID 215187.1)

创建的密码为oracle

 

Cd /oracle/multnovo/hurp/sqlt/run

Sqlplus / as sysdba

SQL> start sqltxtract.sql 0wnbhwrfvgktk

请使用浏览器的分享功能分享到微信等