oracle收集统计信息之analyze

本文介绍Oracle数据库中如何使用analyze命令收集表和索引的统计信息,包括全表扫描收集方式和抽样收集方法,并演示其对SQL缓存的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


oracle收集统计信息之analyze
1.analyze 收集表,索引的统计信息,现在oracle不推荐用analyze收集统计信息
 收集表的统计信息Analyze table tablename compute statistics;
 收集索引聚簇统计信息Analyze index|cluster indexname estimate statistics;
 对于大表收集统计信息相当于全表扫描,耗费时间和资源,可以抽样估算法来搜集生成统计速度要快,如果不是要求要有精确数据的话,尽量采用抽样分析法。
 nalyze table tablename estimate statistics sample 20 percent;
 删除表的统计信息:
 ANALYZE TABLE tablename DELETE STATISTICS
实验:
查询jobs表的统计信息以及最后一次统计时间
SQL> select TABLE_NAME,NUM_ROWS,BLOCKS,LAST_ANALYZED from user_tables where table_name='JOBS';
TABLE_NAME                       NUM_ROWS     BLOCKS LAST_ANALYZED
------------------------------ ---------- ---------- --------------
JOBS                                   19          5 17-7月 -12
分析表jobs
SQL> analyze table jobs compute statistics;
表已分析。
可以看到jobs的最后一次统计时间变成了29-1月 -13
SQL> select TABLE_NAME,NUM_ROWS,BLOCKS,LAST_ANALYZED from user_tables where table_name='JOBS';
TABLE_NAME                       NUM_ROWS     BLOCKS LAST_ANALYZED
------------------------------ ---------- ---------- --------------
JOBS                                   19          5 29-1月 -13
删除jobs表的统计信息
SQL> analyze table jobs delete statistics;
表已分析。
查看统计信息已经被删除了
SQL> select TABLE_NAME,NUM_ROWS,BLOCKS,LAST_ANALYZED from user_table where table_name='JOBS'

TABLE_NAME                       NUM_ROWS     BLOCKS LAST_ANALYZED
------------------------------ ---------- ---------- --------------
JOBS

利用抽样收集jobs表的统计信息:
SQL> analyze table jobs estimate statistics sample 20 percent;

表已分析。
再次查看jobs表的统计信息,统计同样被收集:
SQL> select TABLE_NAME,NUM_ROWS,BLOCKS,LAST_ANALYZED from user_tables where table_name='JOBS';

TABLE_NAME                       NUM_ROWS     BLOCKS LAST_ANALYZED
------------------------------ ---------- ---------- --------------
JOBS                                   19          5 29-1月 -13
SQL>


用analyze统计表的统计信息会是shared pool缓存的sql失效:
查询的sql
SQL>  select count(*) from jobs;

  COUNT(*)
----------
        19
查看该sql在相关信息可以看到sql执行1次解析一次
SQL> select sql_text,sql_id,hash_value,executions exec,loads,invalidations inva
id from v$sqlarea where sql_text like '&text%';
输入 text 的值:  select count
原值    1: select sql_text,sql_id,hash_value,executions exec,loads,invalidation
 invalid from v$sqlarea where sql_text like '&text%'
新值    1: select sql_text,sql_id,hash_value,executions exec,loads,invalidation
 invalid from v$sqlarea where sql_text like 'select count%'

SQL_TEXT                       SQL_ID        HASH_VALUE       EXEC      LOADS
------------------------------ ------------- ---------- ---------- ----------
   INVALID
----------
select count(*) from jab  8r5sp8cjcpqan  583719252          1          1
         0
SQL>
再次分析表jobs
SQL> analyze table jobs compute statistics;

表已分析。
再次执行查询的sql并查看sql在v$sqlarea情况发现sql又被解析了一次,并失效一次这说明用analyze收集表的信息可以使shared pool相关对象的sql失效
SQL>  select count(*) from jobs;

  COUNT(*)
----------
        19

SQL> select sql_text,sql_id,hash_value,executions exec,loads,invalidations inva
id from v$sqlarea where sql_text like '&text%';
输入 text 的值:  select count
原值    1: select sql_text,sql_id,hash_value,executions exec,loads,invalidation
 invalid from v$sqlarea where sql_text like '&text%'
新值    1: select sql_text,sql_id,hash_value,executions exec,loads,invalidation
 invalid from v$sqlarea where sql_text like 'select count%'

SQL_TEXT                       SQL_ID        HASH_VALUE       EXEC      LOADS
------------------------------ ------------- ---------- ---------- ----------
   INVALID
----------
select count(*) from jobs   8r5sp8cjcpqan  583719252          1          2

         1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值