ITPub博客

首页 > 数据库 > Oracle > analyze与dbms_stats的比较

analyze与dbms_stats的比较

Oracle 作者:xypincle 时间:2017-04-18 23:10:38 0 删除 编辑

  1. 1.都可以用来对表、索引、列的统计信息和数据字典统计信息;

  2. 2.系统统计信息和系统内部对象统计信息只能用dbms_stats,而不能用analyze,否则报错;

  3. 举例如下:
  4. --使用analyze分析系统表
  5. SQL> analyze table x$bh compute statistics;
  6. analyze table x$bh compute statistics
  7.               *
  8. ERROR at line 1:
  9. ORA-02030: can only select from fixed tables/views

  10. ----使用dbms_stats分析系统表
  11. SQL> exec dbms_stats.gather_table_stats(ownname=>'SYS',tabname=>'X$BH');
  12. PL/SQL procedure successfully completed.

  13. 3.analyze的语法
  14. --收集统计信息
  15. SQL> analyze table t1 compute statistics;
  16. Table analyzed.

  17. --删除统计信息(包括删除表、所有列及所有索引的统计信息)
  18. SQL> analyze table t1 delete statistics;
  19. Table analyzed.

  20. --只对表收集统计信息,并且以估算模式,采样比例为15%
  21. SQL> analyze table t1 estimate statistics sample 15 percent for table;
  22. Table analyzed.

  23. --只对表收集统计信息,并且以计算模式
  24. SQL> analyze table t1 compute statistics for table;
  25. Table analyzed.

  26. --对表上的列字段进行计算模式收集统计信息
  27. SQL> analyze table t1 compute statistics for columns object_name,object_id;
  28. Table analyzed.

  29. --对表和列以计算模式收集统计信息
  30. SQL> analyze table t1 compute statistics for table for columns object_name,object_id;
  31. Table analyzed.

  32. 备注:对同一个对象而言,新执行的analyze命令会抹掉之前analyze的结果

  33. --对索引收集统计信息
  34. SQL> analyze index idx_t1 compute statistics;
  35. Index analyzed.

  36. 3.dbms_stats包里常用的4个存储过程:
  37. 3.1 gather_table_stats 用于收集目标表、目标表的列和目标表上的索引的统计信息
  38. 3.2 gather_index_stats 用于收集指定索引的统计信息
  39. 3.3 gather_schema_stats 用于收集指定schema下所有对象的统计信息
  40. 3.4 gather_datatabase_stats 用于收集全库所有对象的统计信息

  41. 举例如下:
  42. --只对表t1收集统计信息,并且是以估算模式,采样的比例同样为15%
  43. SQL> exec dbms_stats.gather_table_stats(ownname=>'SYS',tabname=>'T1',estimate_percent=>15,method_opt=>'for table',cascade=>false);
  44. PL/SQL procedure successfully completed.

  45. --对表t1的列object_name和object_id以计算模式收集统计信息(不收集直方图)
  46. SQL> exec dbms_stats.gather_table_stats(ownname=>'SYS',tabname=>'T1',estimate_percent=>100,method_opt=>'for columns size 1 object_name,object_id',cascade=>false);
  47. PL/SQL procedure successfully completed.

  48. --收集索引的统计信息
  49. SQL> exec dbms_stats.gather_index_stats(ownname=>'SYS',indname=>'IDX_T1',estimate_percent=>100);
  50. PL/SQL procedure successfully completed.

  51. --删除表的统计信息
  52. SQL> exec dbms_stats.delete_table_stats(ownname=>'SYS',tabname=>'T1');
  53. PL/SQL procedure successfully completed.

  54. --一次性收集表,表上的所有列和所有的索引的统计信息
  55. SQL> exec dbms_stats.gather_table_stats(ownname=>'SYS',tabname=>'T1',estimate_percent=>100,cascade=>true);
  56. PL/SQL procedure successfully completed.

  57. 4.analyze命令不能正确地收集分区表的统计信息,而dbms_stats包可以.analyze命令只会收集最低层次对象的统计信息,然后推导和汇总出高一级的统计信息。

  58. 5.analyze命令不能并行收集统计信息,而dbms_stats包可以。dbms_stats包的并行收集是通过手工指定输入参数degree来实现的。
  59. 举例如下:
  60. SQL> exec dbms_stats.gather_table_stats(ownname=>'SYS',tabname=>'T1',cascade=>true,estimate_percent=>100,degree=>4);
  61. PL/SQL procedure successfully completed.

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28878983/viewspace-2137515/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: oracle dump详解
请登录后发表评论 登录
全部评论

注册时间:2013-05-11

  • 博文量
    208
  • 访问量
    212338