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

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

131

积分

1

好友

13

主题
1#
发表于 2012-4-17 16:37:36 | 查看: 5033| 回复: 3
  1. SQL> drop table t2 purge;

  2. Table dropped.

  3. SQL> create table t2 as select * from all_objects
  4.   2  ;

  5. Table created.

  6. SQL> create index idn_t2 on t2(status);

  7. Index created.

  8. SQL> exec   dbms_stats.gather_table_stats(ownname=>'CLM',tabname=>'T2',cascade=>true,estimate_percent=>100,method_opt=>'for all columns size 1');  

  9. PL/SQL procedure successfully completed.

  10. SQL> select status,count(1) from t2 group by t2;
  11. select status,count(1) from t2 group by t2
  12.                                         *
  13. ERROR at line 1:
  14. ORA-00904: "T2": invalid identifier


  15. SQL> select status,count(1) from t2 group by status;

  16. STATUS    COUNT(1)
  17. ------- ----------
  18. VALID        71038
  19. INVALID          2

  20. SQL> set autotrace on
  21. SQL> select object_id ,status from t2 where status='INVALID';

  22. OBJECT_ID STATUS
  23. ---------- -------
  24.      73871 INVALID
  25.      73846 INVALID


  26. Execution Plan
  27. ----------------------------------------------------------
  28. Plan hash value: 1513984157

  29. --------------------------------------------------------------------------
  30. | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
  31. --------------------------------------------------------------------------
  32. |   0 | SELECT STATEMENT  |      | 35520 |   416K|   284   (1)| 00:00:04 |
  33. |*  1 |  TABLE ACCESS FULL| T2   | 35520 |   416K|   284   (1)| 00:00:04 |
  34. --------------------------------------------------------------------------

  35. Predicate Information (identified by operation id):
  36. ---------------------------------------------------

  37.    1 - filter("STATUS"='INVALID')


  38. Statistics
  39. ----------------------------------------------------------
  40.           1  recursive calls
  41.           0  db block gets
  42.        1018  consistent gets
  43.           0  physical reads
  44.           0  redo size
  45.         669  bytes sent via SQL*Net to client
  46.         523  bytes received via SQL*Net from client
  47.           2  SQL*Net roundtrips to/from client
  48.           0  sorts (memory)
  49.           0  sorts (disk)
  50.           2  rows processed

  51. SQL>
复制代码

为什么走的是全表扫描?这个invalid只有2个值应该有索引才对啊,忘刘总解答
2#
发表于 2012-4-17 18:07:31
是因为没有收集直方图信息导致oracle不知道值分布走了全表扫描

那在收集表信息的时候是否收集直方图信息啊,实际环境中表很多很多,改如何进行判断?刘总有什么好的建议

回复 只看该作者 道具 举报

3#
发表于 2012-4-17 19:02:47
请参考 CBO为什么不走索引?
  http://www.oracledatabase12g.com ... BC%95%EF%BC%9F.html

这篇正好讨论了lz这个问题

回复 只看该作者 道具 举报

4#
发表于 2012-4-18 10:06:13
多谢刘总解答啊!!!

回复 只看该作者 道具 举报

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

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

GMT+8, 2024-11-15 13:31 , Processed in 0.047479 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

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