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

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

0

积分

1

好友

29

主题
1#
发表于 2013-1-23 09:25:20 | 查看: 3923| 回复: 4
虽然我知道全表扫面不代表不高效,但是我感觉我的这个语句如果能不走全表扫面应该会好一点,我加了位图索引把外连接改成了right join它依然是全表扫描,不知道能不能再进一步优化,麻烦各位大师们看看
  1. explain plan for (select  CTL.customer_trx_line_id
  2. from   ra_cust_trx_line_gl_dist_all
  3. CTLGD
  4. right join ra_customer_trx_lines_all CTL on CTLGD.org_id = CTL.org_id
  5.                                          and CTLGD.customer_trx_line_id =
  6.                                              CTL.customer_trx_line_id
  7.                                              )
  8. Select * from table(dbms_xplan.display)
  9. 1         
  10. 2        ---------------------------------------------------------------------------------------------------
  11. 3        | Id  | Operation             | Name                         | Rows  | Bytes |TempSpc| Cost (%CPU)|
  12. 4        ---------------------------------------------------------------------------------------------------
  13. 5        |   0 | SELECT STATEMENT      |                              |  1375K|    23M|       | 32165   (2)|
  14. 6        |*  1 |  HASH JOIN RIGHT OUTER|                              |  1375K|    23M|    26M| 32165   (2)|
  15. 7        |*  2 |   TABLE ACCESS FULL   | RA_CUST_TRX_LINE_GL_DIST_ALL |  1374K|    10M|       | 10322   (2)|
  16. 8        |   3 |   TABLE ACCESS FULL   | RA_CUSTOMER_TRX_LINES_ALL    |  1375K|    13M|       | 19062   (2)|
  17. 9        ---------------------------------------------------------------------------------------------------
  18. 10         
  19. 11        Predicate Information (identified by operation id):
  20. 12        ---------------------------------------------------
  21. 13         
  22. 14           1 - access("CTLGD"."CUSTOMER_TRX_LINE_ID"(+)="CTL"."CUSTOMER_TRX_LINE_ID" AND
  23. 15                      "CTLGD"."ORG_ID"(+)="CTL"."ORG_ID")
  24. 16           2 - filter("CTLGD"."CUSTOMER_TRX_LINE_ID"(+) IS NOT NULL)
  25. 17         
  26. 18        Note
  27. 19        -----
  28. 20           - 'PLAN_TABLE' is old version       

  29. Org_id上有位图索引        customer_trx_line_id上有b*数索引,CTLGD.customer_trx_line_id列上有和其他列的复合索引

  30. 有没有办法能避免对这两个表的全表扫面?

  31. 注:
  32. Ctlgd表
  33. select count(*)
  34. from ra_cust_trx_line_gl_dist_all
  35. 返回2120591行
  36. select count(*) from (
  37. select customer_trx_line_id
  38. from ra_cust_trx_line_gl_dist_all
  39. group by customer_trx_line_id)
  40. 返回1375280行

  41. Ctl表
  42. select count(*)
  43. from ra_customer_trx_lines_all
  44. 返回1375279行
  45. select count(*) from (
  46. select customer_trx_line_id
  47. from ra_customer_trx_lines_all
  48. group by customer_trx_line_id)
  49. 返回1375279行
复制代码
5#
发表于 2013-1-23 10:03:49
感谢大家,添加完复合索引从30秒快到了7秒,感谢诸位

回复 只看该作者 道具 举报

4#
发表于 2013-1-23 09:53:17
tiejiang2009 发表于 2013-1-23 09:30
你可以加提示语,尝试用下嵌套连接方式看看

您好,我试着加了,但是效果还不是太好,依然比较慢,不知道我加的对不对,语句在下面,还有执行计划

回复 只看该作者 道具 举报

3#
发表于 2013-1-23 09:48:18
  1. explain plan for(select /*+ index(ctlgd index_name) index(ctl index_name)*/ CTL.customer_trx_line_id
  2. from   ra_cust_trx_line_gl_dist_all
  3. CTLGD
  4. right join ra_customer_trx_lines_all CTL on CTLGD.org_id = CTL.org_id
  5.                                          and CTLGD.customer_trx_line_id =
  6.                                              CTL.customer_trx_line_id
  7. )
  8. 1         
  9. 2        -----------------------------------------------------------------------------------------------------------
  10. 3        | Id  | Operation                     | Name                         | Rows  | Bytes |TempSpc| Cost (%CPU)|
  11. 4        -----------------------------------------------------------------------------------------------------------
  12. 5        |   0 | SELECT STATEMENT              |                              |  1375K|    23M|       |   172K  (1)|
  13. 6        |*  1 |  HASH JOIN RIGHT OUTER        |                              |  1375K|    23M|    26M|   172K  (1)|
  14. 7        |*  2 |   TABLE ACCESS BY INDEX ROWID | RA_CUST_TRX_LINE_GL_DIST_ALL |  1374K|    10M|       | 59719   (1)|
  15. 8        |   3 |    BITMAP CONVERSION TO ROWIDS|                              |       |       |       |            |
  16. 9        |   4 |     BITMAP INDEX FULL SCAN    | RA_CUST_TRX_LINE_BITMAP3     |       |       |       |            |
  17. 10        |   5 |   TABLE ACCESS BY INDEX ROWID | RA_CUSTOMER_TRX_LINES_ALL    |  1375K|    13M|       |   110K  (1)|
  18. 11        |   6 |    BITMAP CONVERSION TO ROWIDS|                              |       |       |       |            |
  19. 12        |   7 |     BITMAP INDEX FULL SCAN    | IDX$$_ZPBITMAP4              |       |       |       |            |
  20. 13        -----------------------------------------------------------------------------------------------------------
  21. 14         
  22. 15        Predicate Information (identified by operation id):
  23. 16        ---------------------------------------------------
  24. 17         
  25. 18           1 - access("CTLGD"."CUSTOMER_TRX_LINE_ID"(+)="CTL"."CUSTOMER_TRX_LINE_ID" AND
  26. 19                      "CTLGD"."ORG_ID"(+)="CTL"."ORG_ID")
  27. 20           2 - filter("CTLGD"."CUSTOMER_TRX_LINE_ID"(+) IS NOT NULL)
  28. 21         
  29. 22        Note
  30. 23        -----
  31. 24           - 'PLAN_TABLE' is old version
复制代码

回复 只看该作者 道具 举报

2#
发表于 2013-1-23 09:30:19
你可以加提示语,尝试用下嵌套连接方式看看

回复 只看该作者 道具 举报

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

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

GMT+8, 2024-11-16 09:58 , Processed in 0.051428 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

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