当前位置: 首页 > news >正文

Oracle统计信息相关

以下是检查 Oracle 统计信息更新时间的常用方法:

1. 查看表级统计信息更新时间

-- 查看用户表统计信息
SELECT table_name, num_rows,last_analyzed,TO_CHAR(last_analyzed, 'YYYY-MM-DD HH24:MI:SS') as analyze_time,stale_stats
FROM user_tables
WHERE table_name = '表名'
ORDER BY last_analyzed DESC;-- 查看所有表(含系统时间戳)
SELECT owner,table_name,num_rows,blocks,last_analyzed,ROUND((SYSDATE - last_analyzed) * 24) as hours_ago
FROM dba_tables
WHERE owner = '用户名'
ORDER BY last_analyzed;

2. 查看索引统计信息更新时间

-- 查看索引统计信息
SELECT index_name,table_name,last_analyzed,num_rows,distinct_keys,TO_CHAR(last_analyzed, 'YYYY-MM-DD HH24:MI:SS') as analyze_time
FROM user_indexes
WHERE table_name = '表名'
ORDER BY last_analyzed DESC;-- 查看所有索引统计信息
SELECT owner,index_name,table_name,last_analyzed,DENSE_RANK() OVER (PARTITION BY owner ORDER BY last_analyzed DESC) as rank
FROM dba_indexes
WHERE owner = '用户名'
ORDER BY last_analyzed DESC;

3. 查看列统计信息(直方图)

-- 查看列的统计信息
SELECT table_name,column_name,num_distinct,num_nulls,last_analyzed,histogram
FROM user_tab_columns
WHERE table_name = '表名'
ORDER BY last_analyzed DESC;-- 查看直方图统计信息
SELECT table_name,column_name,endpoint_number,endpoint_value,last_analyzed
FROM user_tab_histograms
WHERE table_name = '表名'
ORDER BY table_name, column_name, endpoint_number;

4. 查看分区统计信息

-- 查看分区表统计信息
SELECT table_name,partition_name,num_rows,last_analyzed,ROUND((SYSDATE - last_analyzed) * 24, 2) as hours_ago
FROM user_tab_partitions
WHERE table_name = '表名'
ORDER BY last_analyzed DESC;-- 查看子分区统计信息
SELECT table_name,partition_name,subpartition_name,num_rows,last_analyzed
FROM user_tab_subpartitions
WHERE table_name = '表名'
ORDER BY last_analyzed DESC;

5. 统计信息是否过期(STALE_STATS)

-- 查看过期统计信息
SELECT owner,table_name,stale_stats,last_analyzed,CASE WHEN stale_stats = 'YES' THEN '统计信息过期'WHEN stale_stats = 'NO' THEN '统计信息有效'ELSE '未分析'END as status
FROM dba_tab_statistics
WHERE owner = '用户名'
AND stale_stats = 'YES'  -- 只看过期的
ORDER BY last_analyzed;-- 查看所有表状态
SELECT owner,COUNT(*) as total_tables,SUM(CASE WHEN stale_stats = 'YES' THEN 1 ELSE 0 END) as stale_tables,SUM(CASE WHEN last_analyzed IS NULL THEN 1 ELSE 0 END) as never_analyzed
FROM dba_tab_statistics
WHERE owner = '用户名'
GROUP BY owner;

6. 汇总脚本

-- 统计信息健康度报告
SELECT owner,table_name,num_rows,blocks,last_analyzed,stale_stats,CASE WHEN last_analyzed IS NULL THEN '从未分析'WHEN stale_stats = 'YES' THEN '已过期'WHEN (SYSDATE - last_analyzed) > 7 THEN '超过7天未更新'WHEN (SYSDATE - last_analyzed) > 1 THEN '超过1天未更新'ELSE '最近更新'END as analyze_status,ROUND((SYSDATE - last_analyzed) * 24, 2) as hours_since_analyze
FROM dba_tab_statistics
WHERE owner = '用户名'
AND (stale_stats = 'YES' OR last_analyzed IS NULL OR (SYSDATE - last_analyzed) > 1)
ORDER BY last_analyzed NULLS FIRST;

7. 检查统计信息收集任务

-- 查看自动统计信息收集窗口
SELECT window_name,REPLACE(REPLACE(resource_plan, '<![CDATA[', ''), ']]>', '') as resource_plan,enabled,next_start_date,repeat_interval
FROM dba_scheduler_windows
WHERE window_name LIKE 'MON%' OR window_name LIKE 'WEE%'
ORDER BY window_name;-- 查看统计信息收集作业状态
SELECT job_name,enabled,state,next_run_date,repeat_interval
FROM dba_scheduler_jobs
WHERE job_name LIKE '%GATHER%STATS%';-- 查看最近执行的统计信息收集任务
SELECT job_name,job_action,run_date,SUCC_DONE
FROM dba_scheduler_job_run_details
WHERE job_name LIKE '%GATHER%STATS%'
ORDER BY run_date DESC
FETCH FIRST 20 ROWS ONLY;

8. 检查统计信息锁

-- 查看表是否被锁定统计信息
SELECT owner,table_name,stattype_locked
FROM dba_tab_statistics
WHERE owner = '用户名'
AND stattype_locked IS NOT NULL;-- 查看索引是否被锁定统计信息
SELECT owner,index_name,table_name,stattype_locked
FROM dba_ind_statistics
WHERE owner = '用户名'
AND stattype_locked IS NOT NULL;

9. 对比不同时间点的统计信息

-- 对比历史统计信息(使用AWR)
SELECT snap_id,begin_interval_time,end_interval_time,table_name,num_rows
FROM dba_hist_tab_stat_history
WHERE owner = '用户名'
AND table_name = '表名'
ORDER BY snap_id DESC;

10. 实用诊断脚本

-- 完整的统计信息诊断报告
SELECT '表统计信息' as type,owner,table_name as object_name,last_analyzed,stale_stats,ROUND((SYSDATE - last_analyzed) * 24, 2) as hours_ago
FROM dba_tab_statistics
WHERE owner = '用户名'
AND (stale_stats = 'YES' OR last_analyzed IS NULL)UNION ALLSELECT '索引统计信息' as type,owner,index_name as object_name,last_analyzed,'' as stale_stats,ROUND((SYSDATE - last_analyzed) * 24, 2) as hours_ago
FROM dba_ind_statistics
WHERE owner = '用户名'
AND last_analyzed IS NULLORDER BY hours_ago DESC NULLS FIRST;

11. 快速检查特定表

-- 一键查看表的所有统计信息
SELECT t.table_name,t.num_rows as table_rows,t.blocks as table_blocks,t.last_analyzed as table_analyzed,t.stale_stats as table_stale,COUNT(i.index_name) as index_count,MAX(i.last_analyzed) as latest_index_analyzed
FROM user_tables t
LEFT JOIN user_indexes i ON t.table_name = i.table_name
WHERE t.table_name = '表名'
GROUP BY t.table_name, t.num_rows, t.blocks, t.last_analyzed, t.stale_stats;

12. 检查统计信息收集配置

-- 查看统计信息收集参数
SELECT name, value, description
FROM v$parameter
WHERE name IN ('optimizer_use_pending_statistics','optimizer_dynamic_sampling','optimizer_capture_sql_plan_baselines','statistics_level','preferred_aggregate_function'
);-- 查看数据库统计信息
SELECT * FROM dba_optstat_operations
ORDER BY end_time DESC
FETCH FIRST 10 ROWS ONLY;

常用场景示例

场景1:检查未更新统计信息的表

SELECT owner, table_name, last_analyzed
FROM dba_tables
WHERE owner = '用户名'
AND (last_analyzed IS NULL OR last_analyzed < SYSDATE - 7)
ORDER BY last_analyzed NULLS FIRST;

场景2:检查大表的统计信息

SELECT owner, table_name, num_rows, last_analyzed
FROM dba_tables
WHERE owner = '用户名'
AND num_rows > 1000000
ORDER BY num_rows DESC;

场景3:SQL执行计划改变前后的对比

-- 记录当前统计信息时间
SELECT table_name, last_analyzed 
FROM user_tables 
WHERE table_name IN ('表1', '表2');-- 重新收集统计信息后对比

更新统计信息

-- 收集表统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname => '用户名', tabname => '表名');-- 收集所有对象统计信息
EXEC DBMS_STATS.GATHER_SCHEMA_STATS(ownname => '用户名');-- 收集数据库统计信息
EXEC DBMS_STATS.GATHER_DATABASE_STATS();-- 收集统计信息并查看进展
EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname => '用户名',tabname => '表名',estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,method_opt => 'FOR ALL COLUMNS SIZE AUTO',cascade => TRUE
);

关键点:

  • last_analyzed 越新越好
  • stale_stats = 'YES' 表示可能过期
  • 大表建议开启自动统计信息收集
  • 被锁定的统计信息需要手动处理
http://www.zskr.cn/news/26455.html

相关文章:

  • Consul 与 Prometheus 集成实战:服务自动发现与监控配置指南(含 ThinkPHP8 示例)
  • 完整教程:笔记本键盘失灵别慌!3种方法快速禁用(附恢复技巧)
  • 2025年工业设备安装厂家权威推荐榜:管道/电气/暖通空调/空压系统/纯水系统/厂房通风/车间配电/机械设备安装服务深度解析
  • 2025 年最新防伪溯源服务商权威推荐榜单:AI 技术赋能 + 软硬件一体优选指南及品牌选择攻略防伪溯源标签/AI防伪溯源/防伪溯源数字标签推荐
  • 题解:P1196 [NOI2002] 银河英雄传说
  • 2025年陶瓷过滤机厂家权威推荐榜:真空/盘式/矿用/全自动/真空带式陶瓷过滤机,固液分离设备,尾矿处理设备,圆盘过滤机专业选购指南
  • 2025 装修公司推荐排行榜单:江苏/浙江/制药厂/厂房/实验室/办公室/店面/净化室装修公司推荐,实测老客复购率与专业能力
  • xupt 3g移动开发实验室二面
  • 碰一碰,秒更新!游戏近场快传助力多人联机无缝组队
  • Moka AI 驱动 HR系统转型实践案例:从技术探索到组织价值落地的全链路解析
  • 2025年服饰厂家权威推荐榜:棒球帽,卫衣,羽绒服源头厂家精选,潮流设计与舒适品质口碑之选
  • 阿里云SLB指标监控
  • 洛谷题单指南-进阶数论-CF632D Longest Subsequence
  • 2025 年最新推荐锯床实力厂家排行榜:龙门 / 数控 / 金属带锯床等多类型设备权威甄选优质企业角度/金属带/双立柱/小型/大型锯床厂家推荐
  • 20232313 2025-2026-1 《网络与系统攻防技术》实验二实验报告 - 20232313
  • 九种UML常见图 -2025.10.19
  • 2025 年电缆桥架生产厂家最新推荐排行榜:聚焦北方 / 河北区域及瓦楞 / 防火 / 模压 / 镀锌桥架优质品牌深度解析
  • JavaScript 开发代码规范指南
  • 04.Python百行代码制作查询工具
  • 2025 油烟机厂家最新推荐榜:五大实力厂商技术与服务口碑评测权威发布滑轨/易清洁/免清洗/智能油烟机厂家推荐
  • VUE---打印功能
  • 鸿蒙NEXT网络管理:从“能用”到“智能”的架构演进 - 指南
  • PostgreSQL可观测性完整方案
  • 2025年大连甘井子区优质养老机构推荐:从社区到自然的暖心之选
  • 2025年主轴维修厂家企业推荐: 电/高速/精密/磨床/进口磨床/加工中心电/数控机床/高速电主轴维修厂家,服务商助力制造企业降本增效
  • 在写left join的时候 是大表在左侧 还是小表在左侧(一)
  • 【IEEE出版】2025年智能控制与计算科学国际学术会议 (ICICCS 2025)
  • 2025 年地铺石厂家最新推荐榜:涵盖生态/仿石/陶瓷等品类,揭秘行业口碑优质企业18厚/火烧/庭院/陶瓷地铺石厂家推荐
  • 2025-10-20-随感
  • 2025电源适配器厂家推荐,华威仕电子科技专业制造实力企业