ORACLE 统计信息

1.查看统计信息被锁定的表

  SELECT OWNER, TABLE_NAME
    FROM DBA_TAB_STATISTICS
   WHERE STATTYPE_LOCKED IS NOT NULL AND OWNER = 'XXXXX'
GROUP BY OWNER, TABLE_NAME;

2.自动统计信息的查看与关闭

参考:Oracle统计信息收集与关闭

3.手动设置统计信息

3.1.普通表设置统计信息

EXEC DBMS_STATS.SET_TABLE_STATS('MONKEY','TESTTABLE',NUMROWS=>175603,NUMBLKS=>2794,AVGRLEN=>109);

SELECT NUM_ROWS,BLOCKS,AVG_ROW_LEN FROM USER_TABLES WHERE TABLE_NAME='TESTTABLE';

3.2.分区表设置统计信息

-- 手动设置分区统计信息
EXEC DBMS_STATS.SET_TABLE_STATS('TABLE_OWNER','TABLE_NAME',PARTNAME=>'PART_P201403',NUMROWS=>690857285,NUMBLKS=>17753800,AVGRLEN=>121);

-- 得到全部分区设置脚本
SELECT    'exec DBMS_STATS.SET_TABLE_STATS('''
       || OWNER
       || ''','''
       || TABLE_NAME
       || ''',partname=>'''
       || PARTITION_NAME
       || ''',numrows=>690857285,numblks=>17753800,avgrlen=>121);'
  FROM dba_tab_statistics
 WHERE     owner = 'MONKEY'
       AND table_name = 'TESTTAB'
       AND PARTITION_NAME IS NOT NULL;

-- 设置分区表整表统计信息
SELECT SUM (NUM_ROWS), SUM (BLOCKS)
  FROM dba_tab_statistics
 WHERE     owner = 'MONKEY'
       AND table_name = 'TESTTAB'
       AND partition_name IS NOT NULL;      
-- sum(num_rows)和sum(blocks)为上一步得到的值,avgrlen和每个分区相同 
EXEC DBMS_STATS.SET_TABLE_STATS('MONKEY','TESTTAB',numrows=>sum(NUM_ROWS),numblks=>sum(BLOCKS),avgrlen=>121);    

4.手动收集统计信息

EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'MONKEY',TABNAME=>'DYSAM',ESTIMATE_PERCENT=>DBMS_STATS.AUTO_SAMPLE_SIZE,METHOD_OPT => 'for all columns size auto' ,CASCADE => TRUE ,DEGREE=>6);

ESTIMATE_PERCENT:采样百分比(默认值为DBMS_STATS.AUTO_SAMPLE_SIZE,由oracle自动决定,也可以设置为30,采样百分之三十)

METHOD_OPT:

for all columns:统计所有列的直方图

for all indexed columns:统计所有indexed列的直方图

for all hidden columns:统计隐藏列列的直方图

for columns SIZE | REPEAT | AUTO | SKEWONLY:统计指定列的直方图

CASCADE:是否统计索引的统计信息

DEGREE:并行度

5.删除统计信息

EXEC DBMS_STATS.DELETE_TABLE_STATS(OWNNAME => 'MONKEY',TABNAME => 'DYSAM') ;

6.自动统计信息收集的条件

6.1.收集的对象

  1. 没有统计信息
  2. 上次收集万统计信息中间执行过truncate操作
  3. 上次收集后表行的变化量超过一定数量的(行的变化量记录在dba_tab_modifications中,调用dbms_stats.flush_database_monitoring_info可以刷新视图)

6.2.查看统计信息过时表

select owner,table_name,stale_stats from dba_tab_statistics;
-- stale_stats:no没有过时,yes已经过时,none丢失统计信息

参考:

DBMS_STATS.GATHER_TABLE_STATS详解 - 卡卡不卡 - 博客园 (cnblogs.com)

Oracle 统计信息介绍 - 空白葛 - 博客园 (cnblogs.com)

posted @   monkey6  阅读(11)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示