Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖
1#
发表于 2013-10-14 17:30:13
本帖最后由 dla001 于 2013-10-14 17:32 编辑

Hi maclean
select s.order_ukid ,(select count(*) from ecmdta.se_order_detail d where d.order_ukid=s.order_ukid )from ecmdta.se_order s where s.order_ukid=1111;
  1. OO                             OBJECT_NAME                                                                                Execution Order
  2. ------------------------------ ------------------------------------------------------------------------------------------ ---------------
  3. SELECT STATEMENT                                                                                                                        4
  4. SORT AGGREGATE                                                                                                                          2
  5. INDEX RANGE SCAN               SE_ORDER_DETAIL_1                                                                                        1
  6. INDEX UNIQUE SCAN              SE_ORDER_0                                                                                               3
复制代码
使用Adrian Billington的xplan扩展包也显示与你的一样的结果。
  1. SQL_ID  3vkh6vctzafhu, child number 0
  2. -------------------------------------
  3. select s.order_ukid ,(select count(*) from ecmdta.se_order_detail d
  4. where d.order_ukid=s.order_ukid )from ecmdta.se_order s where
  5. s.order_ukid=1111

  6. Plan hash value: 3057353959

  7. -----------------------------------------------------------------------------------------------
  8. | Id  | Order | Operation         | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
  9. -----------------------------------------------------------------------------------------------
  10. |   0 |     4 | SELECT STATEMENT  |                   |       |       |     2 (100)|          |
  11. |   1 |     2 |  SORT AGGREGATE   |                   |     1 |    10 |            |          |
  12. |*  2 |     1 |   INDEX RANGE SCAN| SE_ORDER_DETAIL_1 |     4 |    40 |     3   (0)| 00:00:01 |
  13. |*  3 |     3 |  INDEX UNIQUE SCAN| SE_ORDER_0        |     1 |    10 |     2   (0)| 00:00:01 |
  14. -----------------------------------------------------------------------------------------------

  15. Predicate Information (identified by operation id):
  16. -----------------------------------------------------------

  17.    2 - access("D"."ORDER_UKID"=:B1)
  18.    3 - access("S"."ORDER_UKID"=1111)
复制代码
这是有问题的吧。应该是先执行3,再执行2。如果是先执行2,access("D"."ORDER_UKID"=:B1),那么它怎么可能知道 :B1是什么,这个应该是下面传过来的才对。

回复 显示全部楼层 道具 举报

2#
发表于 2013-10-15 10:03:50
本帖最后由 dla001 于 2013-10-15 10:07 编辑
Maclean Liu(刘相兵 发表于 2013-10-14 22:07
请给出测试用例


11.2.0.3.7  x64
OEL5.8 x64

执行计划显示的是先执行子查询,但子查询中的条件是主查询传过的才对,应该是先主再子。
  1. create table zwh_main (id number, c1 varchar2(50));
  2. create table zwh_sub  (id number, id2 number);
  3. insert into zwh_main select rownum, 'hello' from dual connect by level <10000;
  4. insert into zwh_sub  select rownum,rownum from dual connect by level <1000;
  5. create index idx_zwh_main  on zwh_main(id);
  6. create index idx_zwh_sub on zwh_sub(id);
  7. set linesize 150
  8. set long 999
  9. set pagesize 99
  10. select zwh_main.*,(select sum(id2) from zwh_sub where zwh_sub.id=zwh_main.id) s
  11. from zwh_main
  12. where zwh_main.id=100;
  13. select * from table(dbms_xplan.display_cursor());

  14. SQL_ID  56aha300yf6gt, child number 0
  15. -------------------------------------
  16. select zwh_main.*,(select sum(id2) from zwh_sub where
  17. zwh_sub.id=zwh_main.id) s from zwh_main where zwh_main.id=100

  18. Plan hash value: 4037143566

  19. ---------------------------------------------------------------------------------------------
  20. | Id  | Operation                    | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
  21. ---------------------------------------------------------------------------------------------
  22. |   0 | SELECT STATEMENT             |              |       |       |     2 (100)|          |
  23. |   1 |  SORT AGGREGATE              |              |     1 |    26 |            |          |
  24. |   2 |   TABLE ACCESS BY INDEX ROWID| ZWH_SUB      |    10 |   260 |     2   (0)| 00:00:01 |
  25. |*  3 |    INDEX RANGE SCAN          | IDX_ZWH_SUB  |     4 |       |     1   (0)| 00:00:01 |
  26. |   4 |  TABLE ACCESS BY INDEX ROWID | ZWH_MAIN     |     1 |    40 |     2   (0)| 00:00:01 |
  27. |*  5 |   INDEX RANGE SCAN           | IDX_ZWH_MAIN |     1 |       |     1   (0)| 00:00:01 |
  28. ---------------------------------------------------------------------------------------------

  29. Predicate Information (identified by operation id):
  30. ---------------------------------------------------

  31.    3 - access("ZWH_SUB"."ID"=:B1)
  32.    5 - access("ZWH_MAIN"."ID"=100)

  33. Note
  34. -----
  35.    - dynamic sampling used for this statement (level=2)


  36. 28 rows selected.

  37. SQL> @sqlorder
  38. Enter value for macsqlid: 56aha300yf6gt
  39. old   1: select 'Input SQL_ID        : ',lower('&&macsqlid') macsqlid from dual
  40. new   1: select 'Input SQL_ID        : ',lower('56aha300yf6gt') macsqlid from dual

  41. Input SQL_ID        :  56aha300yf6gt

  42. Enter value for child_number: 0
  43. old   1: select 'Input Child_number  : ',lower('&&child_number') child_number from dual
  44. new   1: select 'Input Child_number  : ',lower('0') child_number from dual

  45. Input Child_number  :  0

  46. old   2: sql_id='&&macsqlid' and child_number=&&child_number
  47. new   2: sql_id='56aha300yf6gt' and child_number=0

  48. Table created.


  49. Table created.


  50. PL/SQL procedure successfully completed.

  51. old   2: sql_id='&&macsqlid' and child_number=&&child_number
  52. new   2: sql_id='56aha300yf6gt' and child_number=0

  53. 6 rows created.


  54. Commit complete.


  55. OO                             OBJECT_NAME                    Execution Order
  56. ------------------------------ ------------------------------ ---------------
  57. SELECT STATEMENT                                                            6
  58. SORT AGGREGATE                                                              3
  59. TABLE ACCESS BY INDEX ROWID    ZWH_SUB                                      2
  60. INDEX RANGE SCAN               IDX_ZWH_SUB                                  1
  61. TABLE ACCESS BY INDEX ROWID    ZWH_MAIN                                     5
  62. INDEX RANGE SCAN               IDX_ZWH_MAIN                                 4

  63. 6 rows selected.


  64. Commit complete.


  65. Table dropped.


  66. Table dropped.


复制代码

回复 显示全部楼层 道具 举报

3#
发表于 2013-10-15 12:01:26
感谢给出实验步骤,学习。

回复 显示全部楼层 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-6-15 05:36 , Processed in 0.048188 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569