Thread: 关于同样的语句和执行计划,同样的数据量效率差距巨大的问题

关于同样的语句和执行计划,同样的数据量效率差距巨大的问题
Posted: 2012-10-25 上午12:35
 
Click to report abuse... Click to reply to this threadReply
事发问题,测试环境程序测试完后第二天,发布于生产环境,结果出现了大量用户堵塞问题,查看数据库为某一条语句效率很低,紧急调整后事故解决,事后开总结会,开发的提出在测试环境语句效率很高,生产环境却很低,询问本人
本人经拙劣测试把语句摘到最小化,发现确实效率差距巨大,以下为语句
SELECT count(*) FROM PAY_DTL T WHERE
(T.MER_ID = '0000043686' OR T.PAY_CUST_ID = '0000043686' OR T.RECV_CUST_ID= '0000043686' OR T.ORDER_ID IN (SELECT I.ORDER_ID FROM AUDIT_GOPAY_ORDER_ITEM I WHERE I.RECV_EMAIL = 'yanshi_gfb@126.com'))
AND T.EXT_TXN_DT >= '20120923' AND T.EXT_TXN_DT <= '20121023';

当时生产库PAY表有480W行,测试库有350W行,差距很小,但执行计划结果如下:
生产库:
Execution Plan

Plan hash value: 4060007937


IdOperationNameRowsBytesCost (%CPU)Time


0SELECT STATEMENT 1491608 (1)00:00:20
1SORT AGGREGATE 149  
* 2FILTER     
3TABLE ACCESS BY INDEX ROWIDPAY_DTL3255155K1608 (1)00:00:20
* 4INDEX RANGE SCANIDX_PAY_DTL23255 69 (2)00:00:01
* 5TABLE ACCESS FULLAUDIT_GOPAY_ORDER_ITEM1355 (0)00:00:01



Predicate Information (identified by operation id):


2 - filter("T"."PAY_CUST_ID"='0000043686' OR "T"."MER_ID"='0000043686' OR
"T"."RECV_CUST_ID"='0000043686' OR EXISTS (SELECT 0 FROM "AUDIT_GOPAY_ORDER_ITEM" "I" WHERE
"I"."RECV_EMAIL"='tukevin003@163.com' AND "I"."ORDER_ID"=:B1))
4 - access("T"."EXT_TXN_DT">='20120923' AND "T"."EXT_TXN_DT"<='20121023')
filter((("T"."TXN_TYPE"='00' OR "T"."TXN_TYPE"='01' OR "T"."TXN_TYPE"='02' OR
"T"."TXN_TYPE"='03' OR "T"."TXN_TYPE"='06' OR "T"."TXN_TYPE"='25' OR "T"."TXN_TYPE"='27' OR
"T"."TXN_TYPE"='45' OR "T"."TXN_TYPE"='49' OR "T"."TXN_TYPE"='64' OR "T"."TXN_TYPE"='71' OR
"T"."TXN_TYPE"='83' OR "T"."TXN_TYPE"='90' OR "T"."TXN_TYPE"='91' OR "T"."TXN_TYPE"='93' OR
"T"."TXN_TYPE"='96') OR "T"."TXN_TYPE"='24' AND ("T"."TXN_STA_CD"='2' OR "T"."TXN_STA_CD"='6'))
AND "T"."TXN_STA_CD"<>'0' AND "T"."TXN_STA_CD"'x' AND "T"."TXN_STA_CD"'y' AND
"T"."TXN_STA_CD"'z')
5 - filter("I"."RECV_EMAIL"='tukevin003@163.com' AND "I"."ORDER_ID"=:B1)

Statistics


1 recursive calls
0 db block gets
9257155 consistent gets
0 physical reads
0 redo size
526 bytes sent via SQL*Net to client
520 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed

测试库:
Execution Plan

Plan hash value: 4060007937


IdOperationNameRowsBytesCost (%CPU)Time


0SELECT STATEMENT 155787 (0)00:00:10
1SORT AGGREGATE 155  
* 2FILTER     
3TABLE ACCESS BY INDEX ROWIDPAY_DTL1914102K787 (0)00:00:10
* 4INDEX RANGE SCANIDX_PAY_DTL21914 18 (0)00:00:01
* 5TABLE ACCESS FULLAUDIT_GOPAY_ORDER_ITEM1373 (0)00:00:01



Predicate Information (identified by operation id):


2 - filter("T"."RECV_CUST_ID"='0000043686' OR "T"."PAY_CUST_ID"='0000043686' OR
"T"."MER_ID"='0000043686' OR EXISTS (SELECT 0 FROM "AUDIT_GOPAY_ORDER_ITEM" "I" WHERE
"I"."RECV_EMAIL"='tukevin003@163.com' AND "I"."ORDER_ID"=:B1))
4 - access("T"."EXT_TXN_DT">='20120923' AND "T"."EXT_TXN_DT"<='20121023')
filter("T"."TXN_STA_CD"<>'0' AND "T"."TXN_STA_CD"'z' AND "T"."TXN_STA_CD"'x' AND
"T"."TXN_STA_CD"'y' AND (("T"."TXN_TYPE"='00' OR "T"."TXN_TYPE"='01' OR "T"."TXN_TYPE"='02'
OR "T"."TXN_TYPE"='03' OR "T"."TXN_TYPE"='06' OR "T"."TXN_TYPE"='25' OR "T"."TXN_TYPE"='27' OR
"T"."TXN_TYPE"='45' OR "T"."TXN_TYPE"='49' OR "T"."TXN_TYPE"='64' OR "T"."TXN_TYPE"='71' OR
"T"."TXN_TYPE"='83' OR "T"."TXN_TYPE"='90' OR "T"."TXN_TYPE"='91' OR "T"."TXN_TYPE"='93' OR
"T"."TXN_TYPE"='96') OR "T"."TXN_TYPE"='24' AND ("T"."TXN_STA_CD"='2' OR "T"."TXN_STA_CD"='6')))
5 - filter("I"."RECV_EMAIL"='tukevin003@163.com' AND "I"."ORDER_ID"=:B1)

Statistics


1 recursive calls
0 db block gets
3581 consistent gets
0 physical reads
0 redo size
526 bytes sent via SQL*Net to client
520 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed

事后我怀疑是因为语句嵌套的问题,导致100W的数据差异导致逻辑读和效率差距很大,事后我将生产库的数据完全拷贝到测试库,2个库数据完全一样的时候,执行同样的语句,测试库逻辑读只上升到170W,效率还是很快,生产库为1000多W
生产库为RAC,测试库为单机,怀疑结构问题,将语句在生产库的物理DG端(单机,本地磁盘和测试库配置一样的服务器)执行,仍为1000W逻辑读,效率很低
数据库版本都为11.2.0.3

xhr8334

Posts: 1
Registered: 10/25/12
Re: 关于同样的语句和执行计划,同样的数据量效率差距巨大的问题
Posted: 2012-10-25 上午12:40   in response to: Ming in response to: Ming
 
Click to report abuse... Click to reply to this threadReply
从你描述看,考虑几方面问题。
1 你在主库和DG侧做,结果一样。这就证明了我之前的怀疑,是不是表的计划有问题。因为DG是抽日志的,两侧可以简单认为是镜像,起码在你这个问题上可以这么理解。
2 因为你硬件环境不同,Oracle的引擎会自动优化执行过程,是叫ADDB还是叫什么的,是一个来自10g的新特性。

3 关于你总监发飙的事,我觉得,如果可以的话,你生产库上做个move和gather,再试试看。

开个trace和10046吧。
Robinson

Posts: 1
Registered: 07/29/11
Re: 关于同样的语句和执行计划,同样的数据量效率差距巨大的问题
Posted: 2012-10-25 上午1:24   in response to: Ming in response to: Ming
Helpful
Click to report abuse... Click to reply to this threadReply
其实这个问题很简单,但是可能对这种热------>对ORACLE CBO,对执行计划认识不深的人,可能无法看出此类问题。
出现这种情况,肯定是SQL语句执行计划引起的。大家注意看执行计划里面ID=2是FILTER
FILTER是什么意思呢?它表示说ID=3 返回多少数据,那么ID=5 就会执行 ID=3-ID=2 这么多次。

这里ID=3返回3255行,其实是不可信的,具体你可以自己算一下它返回多少行。通常来说CBO会把返回基数算少。
那么这里我假设它返回3W行记录, 然后呢 你的 测试库 与 生产库 虽然数据量 相同。但是 他们的BLOCK数目肯定不同。
生产库 肯定是在运行中,那么它BLOCK肯定是要经常变化,也就是说生产库的 BLOCK 数目 肯定比 测试库大------着个理解吗?

好, 那么我假设 生产库比 测试库的 BLOCK数目大 500个 ,我假设FILTER 过滤之后返回数据 1W行
那么FILTER 循环就会循环2W次, 那么逻辑读的差异 就是 2W*500=1KW

着个就是根本原因。

具体的解决方案你也知道了,就是把SQL进行改写,用UNION 代替OR 。
我来举个例子,方便你 和你的总监解释,你一可以自己模拟一下:

create table test1 as select * from dba_objects;

create index idx1 on test1(owner);

create table test2 as select * from test1;

SQL> select count(*) from test2;

COUNT(*)

72577

create table test3 as select * from test1 where rownum<62577; ----减去1000行的记录

create index idx2 on test2(owner);
create index idx3 on test3(owner);

select count(*) from test1 a where owner='SCOTT' or
object_id in(select object_id from test2 where owner='SCOTT');

select count(*) from test1 a where owner='SCOTT' or
object_id in(select object_id from test3 where owner='SCOTT');

SQL> select count(*) from test1 a where owner='SCOTT' or
2 object_id in(select object_id from test2 where owner='SCOTT');

已用时间: 00: 00: 03.60

执行计划


Plan hash value: 3372948367


IdOperationNameRowsBytesCost (%CPU)Time


0SELECT STATEMENT 1301063 (1)00:00:13
1SORT AGGREGATE 130  
* 2FILTER     
3TABLE ACCESS FULLTEST1931792729K1063 (1)00:00:13
* 4TABLE ACCESS BY INDEX ROWIDTEST21302 (0)00:00:01
* 5INDEX RANGE SCANIDX220 1 (0)00:00:01



Predicate Information (identified by operation id):


2 - filter("OWNER"='SCOTT' OR EXISTS (SELECT 0 FROM "TEST2" "TEST2" WHERE
"OWNER"='SCOTT' AND "OBJECT_ID"=:B1))
4 - filter("OBJECT_ID"=:B1)
5 - access("OWNER"='SCOTT')

Note

- dynamic sampling used for this statement (level=2)

统计信息


0 recursive calls
0 db block gets
436386 consistent gets -----------逻辑读43w
0 physical reads
0 redo size
430 bytes sent via SQL*Net to client
420 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed


查询 test3

SQL> select count(*) from test1 a where owner='SCOTT' or
2 object_id in(select object_id from test3 where owner='SCOTT');

已用时间: 00: 00: 00.54

执行计划


Plan hash value: 748224891


IdOperationNameRowsBytesCost (%CPU)Time


0SELECT STATEMENT 1301063 (1)00:00:13
1SORT AGGREGATE 130  
* 2FILTER     
3TABLE ACCESS FULLTEST1931792729K1063 (1)00:00:13
* 4TABLE ACCESS BY INDEX ROWIDTEST31301 (0)00:00:01
* 5INDEX RANGE SCANIDX31 1 (0)00:00:01



Predicate Information (identified by operation id):


2 - filter("OWNER"='SCOTT' OR EXISTS (SELECT 0 FROM "TEST3" "TEST3" WHERE
"OWNER"='SCOTT' AND "OBJECT_ID"=:B1))
4 - filter("OBJECT_ID"=:B1)
5 - access("OWNER"='SCOTT')

Note

- dynamic sampling used for this statement (level=2)

统计信息


0 recursive calls
0 db block gets
73601 consistent gets -----逻辑读是7W
0 physical reads
0 redo size
430 bytes sent via SQL*Net to client
420 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed

两个表数据只少了1K行,为什么逻辑读 差别这么大啊???? 着个就是 根本原因。

顺便打个广告,有想学SQL优化的,可以找我 QQ 692162374 。保证教会你一眼看出执行计划哪里有问题的能力,保证教会你5分钟内解决超大型SQL的能力。

帖子经 Robinson编辑过

960105

Posts: 3
Registered: 09/19/12
Re: 关于同样的语句和执行计划,同样的数据量效率差距巨大的问题
Posted: 2012-10-25 上午6:22   in response to: Robinson in response to: Robinson
 
Click to report abuse... Click to reply to this threadReply
大家注意看执行计划里面ID=2是FILTER
FILTER是什么意思呢?它表示说ID=3 返回多少数据,那么ID=5 就会执行 ID=3-ID=2 这么多次。大家注意看执行计划里面ID=2是FILTER

这个可以再解释一下么,没看明白

Liu Maclean(刘相兵)

Posts: 684
Registered: 08/21/12
Re: 关于同样的语句和执行计划,同样的数据量效率差距巨大的问题
Posted: 2012-10-25 上午7:37   in response to: Ming in response to: Ming
 
Click to report abuse... Click to reply to this threadReply
在 测试库和 产品库 分别加入 gather_plan_statistics HINT 执行SQL, 并贴出 A-Rows 的执行计划

怀疑和 基数 cardnality 有关

具体参考 http://www.askmaclean.com/archives/gather-more-plan-statistics-by-gather_plan_statistics-hint.html

Gather more plan statistics by gather_plan_statistics hint

在10g以后我们可以通过利用gather_plan_statistics提示来了解更多的SQL执行统计信息,具体使用方法如下:

SQL> set linesize 150
SQL> set pagesize 2000
SQL> set autotrace traceonly exp

SQL> select avg(SALARY),DEPARTMENT_NAME from 
employees e,departments d where e.DEPARTMENT_ID=d.DEPARTMENT_ID group by DEPARTMENT_NAME;

Execution Plan
----------------------------------------------------------
Plan hash value: 3294250112

---------------------------------------------------------------------------------------------
| Id  | Operation		      | Name	    | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT	      | 	    |	 27 |	621 |	  5  (20)| 00:00:01 |
|   1 |  HASH GROUP BY		      | 	    |	 27 |	621 |	  5  (20)| 00:00:01 |
|   2 |   NESTED LOOPS		      | 	    |	106 |  2438 |	  4   (0)| 00:00:01 |
|   3 |    TABLE ACCESS FULL	      | EMPLOYEES   |	107 |	749 |	  3   (0)| 00:00:01 |
|   4 |    TABLE ACCESS BY INDEX ROWID| DEPARTMENTS |	  1 |	 16 |	  1   (0)| 00:00:01 |
|*  5 |     INDEX UNIQUE SCAN	      | DEPT_ID_PK  |	  1 |	    |	  0   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

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

   5 - access("E"."DEPARTMENT_ID"="D"."DEPARTMENT_ID")

SQL> show parameter cursor_sharing

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
cursor_sharing			     string	 EXACT

SQL>  show parameter statistics_level

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
statistics_level		     string	 TYPICAL

SQL> set autotrace off;

SQL> select /*+ gather_plan_statistics */   avg(SALARY),DEPARTMENT_NAME from 
employees e,departments d where e.DEPARTMENT_ID=d.DEPARTMENT_ID group by DEPARTMENT_NAME;

SQL> select * from TABLE(dbms_xplan.display_cursor(NULL,NULL,'ALLSTATS LAST'));

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID	bctzu9xuxay18, child number 0
-------------------------------------
select /*+ gather_plan_statistics */  avg(SALARY),DEPARTMENT_NAME from employees e,departments d
where e.DEPARTMENT_ID=d.DEPARTMENT_ID group by DEPARTMENT_NAME

Plan hash value: 3294250112
-------------------------------------------------------------------------------------------------------
| Id  | Operation		      | Name	    | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
-------------------------------------------------------------------------------------------------------
|   1 |  HASH GROUP BY		      | 	    |	   1 |	   27 |     11 |00:00:00.01 |	  219 |
|   2 |   NESTED LOOPS		      | 	    |	   1 |	  106 |    106 |00:00:00.01 |	  219 |
|   3 |    TABLE ACCESS FULL	      | EMPLOYEES   |	   1 |	  107 |    107 |00:00:00.01 |	    7 |
|   4 |    TABLE ACCESS BY INDEX ROWID| DEPARTMENTS |	 107 |	    1 |    106 |00:00:00.01 |	  212 |
|*  5 |     INDEX UNIQUE SCAN	      | DEPT_ID_PK  |	 107 |	    1 |    106 |00:00:00.01 |	  106 |
-------------------------------------------------------------------------------------------------------

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

   5 - access("E"."DEPARTMENT_ID"="D"."DEPARTMENT_ID")

/* 可以从starts列看到某种操作执行了多少次,例如这里的INDEX UNIQUE SCAN为107次 */

/*也可以通过SQL_ID来定位计划信息 */


SQL> select t.* 
from v$sql s 
   , table(dbms_xplan.display_cursor(s.sql_id,s.child_number,'ALL IOSTATS LAST')) t where s.sql_id = '&SQL_ID' ;
  

Enter value for sql_id: bctzu9xuxay18 

old   3:    , table(dbms_xplan.display_cursor(s.sql_id,s.child_number,'ALL IOSTATS LAST')) t where s.sql_id = '&SQL_ID'
new   3:    , table(dbms_xplan.display_cursor(s.sql_id,s.child_number,'ALL IOSTATS LAST')) t where s.sql_id = 'bctzu9xuxay18'

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID	bctzu9xuxay18, child number 0
-------------------------------------
select /*+ gather_plan_statistics */ avg(SALARY),DEPARTMENT_NAME from 
employees e,departments d where
e.DEPARTMENT_ID=d.DEPARTMENT_ID group by DEPARTMENT_NAME

Plan hash value: 3294250112

---------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation		      | Name	    | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
---------------------------------------------------------------------------------------------------------------------------------------
|   1 |  HASH GROUP BY		      | 	    |	   1 |	   27 |   621 |     5  (20)| 00:00:01 |     11 |00:00:00.01 |	  219 |
|   2 |   NESTED LOOPS		      | 	    |	   1 |	  106 |  2438 |     4	(0)| 00:00:01 |    106 |00:00:00.01 |	  219 |
|   3 |    TABLE ACCESS FULL	      | EMPLOYEES   |	   1 |	  107 |   749 |     3	(0)| 00:00:01 |    107 |00:00:00.01 |	    7 |
|   4 |    TABLE ACCESS BY INDEX ROWID| DEPARTMENTS |	 107 |	    1 |    16 |     1	(0)| 00:00:01 |    106 |00:00:00.01 |	  212 |
|*  5 |     INDEX UNIQUE SCAN	      | DEPT_ID_PK  |	 107 |	    1 |       |     0	(0)|	      |    106 |00:00:00.01 |	  106 |
---------------------------------------------------------------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$1
   3 - SEL$1 / E@SEL$1
   4 - SEL$1 / D@SEL$1
   5 - SEL$1 / D@SEL$1

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

   5 - access("E"."DEPARTMENT_ID"="D"."DEPARTMENT_ID")

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - "DEPARTMENT_NAME"[VARCHAR2,30], AVG("SALARY")[22]
   2 - "SALARY"[NUMBER,22], "DEPARTMENT_NAME"[VARCHAR2,30]
   3 - "SALARY"[NUMBER,22], "E"."DEPARTMENT_ID"[NUMBER,22]
   4 - "DEPARTMENT_NAME"[VARCHAR2,30]
   5 - "D".ROWID[ROWID,10]

SQL> alter session set statistics_level=ALL;
Session altered.


/* 在session级别设置statistics_level为ALL,可以为我们提供更为详尽的执行统计信息 */
Ming

Posts: 11
Registered: 04/14/12
Re: 关于同样的语句和执行计划,同样的数据量效率差距巨大的问题
Posted: 2012-10-25 下午6:26   in response to: Liu Maclean(刘相兵) in response to: Liu Maclean(刘相兵)
 
Click to report abuse... Click to reply to this threadReply
您好,加完HINT执行计划如下:

生产库:

PLAN_TABLE_OUTPUT

SQL_ID aphv5cu3fckpy, child number 0

SELECT /*+ gather_plan_statistics */ count(*) FROM CIECCPAY.PAY_DTL T
WHERE (T.MER_ID = '0000043686' OR T.PAY_CUST_ID = '0000043686' OR
T.RECV_CUST_ID= '0000043686' OR T.ORDER_ID IN (SELECT I.ORDER_ID FROM
CIECCPAY.AUDIT_GOPAY_ORDER_ITEM I WHERE I.RECV_EMAIL =
'yanshi_gfb@126.com')) AND T.EXT_TXN_DT >= '20120923' AND T.EXT_TXN_DT
<= '20121023'

Plan hash value: 4060007937


IdOperationNameStartsE-RowsA-RowsA-TimeBuffers


0SELECT STATEMENT 1 100:00:11.4310M
1SORT AGGREGATE 11100:00:11.4310M
* 2FILTER 1 200:00:11.4310M
3TABLE ACCESS BY INDEX ROWIDPAY_DTL17900645K00:00:01.69427K
* 4INDEX RANGE SCANIDX_PAY_DTL217900645K00:00:00.356253
* 5TABLE ACCESS FULLAUDIT_GOPAY_ORDER_ITEM645K1100:00:09.289682K



Predicate Information (identified by operation id):


2 - filter(("T"."MER_ID"='0000043686' OR "T"."RECV_CUST_ID"='0000043686' OR
"T"."PAY_CUST_ID"='0000043686' OR IS NOT NULL))
4 - access("T"."EXT_TXN_DT">='20120923' AND "T"."EXT_TXN_DT"<='20121023')
5 - filter(("I"."RECV_EMAIL"='yanshi_gfb@126.com' AND "I"."ORDER_ID"=:B1))

测试库:
PLAN_TABLE_OUTPUT


SQL_ID aphv5cu3fckpy, child number 0

SELECT /*+ gather_plan_statistics */ count(*) FROM CIECCPAY.PAY_DTL T
WHERE (T.MER_ID = '0000043686' OR T.PAY_CUST_ID = '0000043686' OR
T.RECV_CUST_ID= '0000043686' OR T.ORDER_ID IN (SELECT I.ORDER_ID FROM
CIECCPAY.AUDIT_GOPAY_ORDER_ITEM I WHERE I.RECV_EMAIL =
'yanshi_gfb@126.com')) AND T.EXT_TXN_DT >= '20120923' AND T.EXT_TXN_DT
<= '20121023'

Plan hash value: 4060007937


IdOperationNameStartsE-RowsA-RowsA-TimeBuffers


0SELECT STATEMENT 1 100:00:06.124321K
1SORT AGGREGATE 11100:00:06.124321K
* 2FILTER 1 200:00:06.124321K
3TABLE ACCESS BY INDEX ROWIDPAY_DTL17942645K00:00:01.33448K
* 4INDEX RANGE SCANIDX_PAY_DTL217942645K00:00:00.284343
* 5TABLE ACCESS FULLAUDIT_GOPAY_ORDER_ITEM645K1100:00:04.433872K



Predicate Information (identified by operation id):


2 - filter(("T"."MER_ID"='0000043686' OR "T"."RECV_CUST_ID"='0000043686' OR
"T"."PAY_CUST_ID"='0000043686' OR IS NOT NULL))
4 - access("T"."EXT_TXN_DT">='20120923' AND "T"."EXT_TXN_DT"<='20121023')
5 - filter(("I"."RECV_EMAIL"='yanshi_gfb@126.com' AND "I"."ORDER_ID"=:B1))

anbob

Posts: 23
Registered: 07/15/11
Re: 关于同样的语句和执行计划,同样的数据量效率差距巨大的问题
Posted: 2012-10-25 下午8:19   in response to: Ming in response to: Ming
 
Click to report abuse... Click to reply to this threadReply
考虑PROD 的 STATISTICS reads 有构建CR block 因素
Liu Maclean(刘相兵)

Posts: 684
Registered: 08/21/12
Re: 关于同样的语句和执行计划,同样的数据量效率差距巨大的问题
Posted: 2012-10-26 上午1:54   in response to: Ming in response to: Ming
 
Click to report abuse... Click to reply to this threadReply
Plan hash value: 4060007937 执行计划都一样

下一步检测段的状况,请参考一下脚本:

http://www.askmaclean.com/archives/%E8%84%9A%E6%9C%ACsegment-space-usage-explorer.html

脚本:Segment Space Usage Explorer

Script:以下脚本可以用于诊断segement space usage问题:

set serveroutput on;
 
      declare
        v_unformatted_blocks number;
        v_unformatted_bytes number;
        v_fs1_blocks number;
        v_fs1_bytes number;
        v_fs2_blocks number;
        v_fs2_bytes number;
        v_fs3_blocks number;
        v_fs3_bytes number;
       v_fs4_blocks number;
       v_fs4_bytes number;
       v_full_blocks number;
       v_full_bytes number;
     begin
     dbms_space.space_usage ('&OWNER', '&TABNAME', 'TABLE', v_unformatted_blocks,
     v_unformatted_bytes, v_fs1_blocks, v_fs1_bytes, v_fs2_blocks, v_fs2_bytes,
     v_fs3_blocks, v_fs3_bytes, v_fs4_blocks, v_fs4_bytes, v_full_blocks, v_full_bytes);
     dbms_output.put_line('Unformatted Blocks = '||v_unformatted_blocks);
     dbms_output.put_line('FS1 Blocks              = '||v_fs1_blocks);
     dbms_output.put_line('FS2 Blocks              = '||v_fs2_blocks);
     dbms_output.put_line('FS3 Blocks              = '||v_fs3_blocks);
     dbms_output.put_line('FS4 Blocks              = '||v_fs4_blocks);
     dbms_output.put_line('Full Blocks              = '||v_full_blocks);
     end;
     / 
         
         
SELECT TABLE_NAME ,  (BLOCKS *8192 / 1024/1024 ) - (NUM_ROWS*AVG_ROW_LEN/1024/1024)
"Data lower than HWM in MB"   FROM  DBA_TABLES WHERE  UPPER(owner) =UPPER('&OWNER') order by 2 desc;
Ming

Posts: 11
Registered: 04/14/12
Re: 关于同样的语句和执行计划,同样的数据量效率差距巨大的问题
Posted: 2012-10-29 上午12:56   in response to: Liu Maclean(刘相兵) in response to: Liu Maclean(刘相兵)
 
Click to report abuse... Click to reply to this threadReply
您好,测试已经完成,数据如下(表只取了前8):

生产库:
Unformatted Blocks = 472
FS1 Blocks = 32
FS2 Blocks = 39
FS3 Blocks = 109
FS4 Blocks = 2391
Full Blocks = 283035

TABLE_NAME Data lower than HWM in MB

-------------------------
MERCHANT_ORDER_NOTIFY_INFO 447.694523
VC_ACCT_DTL 392.556433
PAY_DTL 365.024868
PAY_DTL_EXPAND_INFO 135.767008
BANK_ORDER_CHECK_LOG 122.174011
USER4AMOUNT 79.888752
BANK_FEE_DTL 57.0051517
ANTI_PHISHING_RECORD 15.6126385
CON_TXN_LOG 10.9062214
BANK_NUMBER 9.50930023
ALLOT_DTL 3.31555939


测试库:
Unformatted Blocks = 0
FS1 Blocks = 1
FS2 Blocks = 3
FS3 Blocks = 7
FS4 Blocks = 62
Full Blocks = 280107

TABLE_NAME Data lower than HWM in MB


-------------------------
MERCHANT_ORDER_NOTIFY_INFO 396.420166
VC_ACCT_DTL 392.556433
PAY_DTL 343.970374
PAY_DTL_EXPAND_INFO 139.431835
BANK_ORDER_CHECK_LOG 134.158684
USER4AMOUNT 79.888752
BANK_FEE_DTL 57.0051517
CON_TXN_LOG 10.9062214
ANTI_PHISHING_RECORD 10.7282228
BANK_NUMBER 9.50930023
RISK_TRANS_LINE 4.43682384

转载: https://forums.oracle.com/forums/thread.jspa?threadID=2456493&tstart=0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值