[20230821]还原表统计信息问题2.txt --//在还原表统计信息时,遇到丢失直方图信息的情况,做一个记录. 1.环境: SCOTT@test01p> @ver1 PORT_STRING VERSION BANNER CON_ID -------------------- ---------- -------------------------------------------------------------------------------- ---------- IBMPC/WIN_NT64-9.1.0 12.2.0.1.0 Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 0 2.建立测试表: create table t3 as select rownum id , cast(dbms_random.string('a',6 ) as varchar2(10)) name from dual connect by level <=1e5; create unique index pk_t3 on t3 (id); alter table t3 add constraint pk_t3 primary key (id); --//@ opstat scott t3 1=1 3.分析表: --//@ gts table_name <method_opt> <estimate_percent> --//执行如下: @ gts t3 1 '' --//exec dbms_stats.gather_table_stats('SCOTT', 'T3', estimate_percent => NULL, method_opt=>'FOR TABLE FOR ALL COLUMNS SIZE 1', cascade=>true, no_invalidate=>false) @ gts t3 254 '' --//exec dbms_stats.gather_table_stats('SCOTT', 'T3', estimate_percent => NULL, method_opt=>'FOR TABLE FOR ALL COLUMNS SIZE 254', cascade=>true, no_invalidate=>false) --//输出略。 --//修改表以及列统计信息: SCOTT@test01p> @ zzdate C30 C30 C31 ------------------- -------------------------------------- -------------------------------------- 2023-08-21 20:40:44 trunc(sysdate)+20/24+40/1440+44/86400 "timestamp'2023-08-21 20:40:44'" --//修改表统计信息: --//@ modtab t3 numrows 2e5 exec dbms_stats.set_table_stats('SCOTT','T3',numrows=>2e5,NO_INVALIDATE=>false,force=>true); SCOTT@test01p> @ zzdate C30 C30 C31 ------------------- -------------------------------------- -------------------------------------- 2023-08-21 20:41:38 trunc(sysdate)+20/24+41/1440+38/86400 "timestamp'2023-08-21 20:41:38'" --//修改字段统计信息: --//@ modcol t3 ename density .000011 exec dbms_stats.SET_COLUMN_STATS('SCOTT','T3','name',density=>.000005,NO_INVALIDATE=>false,force=>true); SCOTT@test01p> @ zzdate C30 C30 C31 ------------------- -------------------------------------- -------------------------------------- 2023-08-21 20:42:35 trunc(sysdate)+20/24+42/1440+35/86400 "timestamp'2023-08-21 20:42:35'" SCOTT@test01p> @desczz t3 '' eXtended describe of t3 DISPLAY TABLE_NAME OF COLUMN_NAME INFORMATION. INPUT OWNER.TABLE_NAME <filters> SAMPLE : @ desczz TABLE_NAME column_name1,column_name2 IF NOT INPUT <filters> ,USE "" . Owner Table_Name SAMPLE_SIZE LAST_ANALYZED Col# Column Name Null? Type NUM_DISTINCT Density NUM_NULLS HISTOGRAM NUM_BUCKETS Low_value High_value ----- ---------- ----------- ------------------- ---- ----------- ---------- ------------ ------------ -------------- ---------- --------- ----------- --------- ---------- SCOTT T3 100000 2023-08-21 20:40:22 1 ID NOT NULL NUMBER(,) 100000 .00001000000 0 HYBRID 254 1 100000 100000 2023-08-21 20:42:22 2 NAME VARCHAR2(10) 100000 .00000500000 0 1 AAAigv zzzZbS --//可以发现name Density=.00000500000,同时name字段的直方图信息破坏。 SCOTT@test01p> @tab2 t3 Show tables matching condition "t3" (if schema is not specified then current user's tables only are shown)... OWNER TABLE_NAME TYPE NUM_ROWS BLOCKS EMPTY AVGSPC ROWLEN TAB_LAST_ANALYZED DEGREE COMPRESS ----- ---------- ---- ------------ ------------- --------- ------ ------ ------------------- -------------------- -------- SCOTT T3 TAB 200000 246 0 0 12 2023-08-21 20:41:05 1 DISABLED --//表NUM_ROWS=200000. 4.还原表统计信息: SCOTT@test01p> @ th t3 OWNER TABLE_NAME PARTITION_NAME SUBPARTITION_NAME STATS_UPDATE_TIME STATS_UPDATE_TIME1 ------ ---------- -------------- -------------------- ------------------------------ ------------------- SCOTT T3 2023-08-21 20:40:13.551000 2023-08-21 20:40:13 SCOTT T3 2023-08-21 20:40:22.352000 2023-08-21 20:40:22 SCOTT T3 2023-08-21 20:41:05.210000 2023-08-21 20:41:05 -- exec dbms_stats.restore_table_stats('SCOTT','T3','2023-08-21 20:41:05',No_Invalidate => false) --//简单说明我的脚本生成的dbms_stats.restore_table_stats取得时间是STATS_UPDATE_TIME1,但是没有秒后面的时间。这样还原应该是没有直方图的信息。 SCOTT@test01p> exec dbms_stats.restore_table_stats('SCOTT','T3','2023-08-21 20:41:05',No_Invalidate => false) PL/SQL procedure successfully completed. SCOTT@test01p> @desczz t3 '' eXtended describe of t3 DISPLAY TABLE_NAME OF COLUMN_NAME INFORMATION. INPUT OWNER.TABLE_NAME <filters> SAMPLE : @ desczz TABLE_NAME column_name1,column_name2 IF NOT INPUT <filters> ,USE "" . Owner Table_Name SAMPLE_SIZE LAST_ANALYZED Col# Column Name Null? Type NUM_DISTINCT Density NUM_NULLS HISTOGRAM NUM_BUCKETS Low_value High_value ----- ---------- ----------- ------------------- ---- ----------- ---------- ------------ ------------ -------------- ---------- --------- ----------- --------- ---------- SCOTT T3 100000 2023-08-21 20:40:22 1 ID NOT NULL NUMBER(,) 100000 .00001000000 0 HYBRID 254 1 100000 100000 2023-08-21 20:40:22 2 NAME VARCHAR2(10) 100000 .00001000000 0 HYBRID 254 AAAigv zzzZbS --//可以发现还原后实际上存在直方图信息。为什么? SCOTT@test01p> @ opstat scott t3 1=1 ID START_TIME END_TIME OPERATION TARGET STATUS NOTES ---- -------------------------- -------------------------- -------------------- -------- --------- ------------------------------------------------------------------------------------------ 5203 2023-08-21 20:40:12.726000 2023-08-21 20:40:15.533000 gather_table_stats SCOTT.T3 COMPLETED <params><param name="block_sample" val="FALSE"/><param name="cascade" val="TRUE"/><param n ame="concurrent" val="FALSE"/><param name="degree" val="NULL"/><param name="estimate_perce nt" val=""/><param name="force" val="FALSE"/><param name="granularity" val="AUTO"/><param name="method_opt" val="FOR TABLE FOR ALL COLUMNS SIZE 1"/><param name="no_invalidate" val= "FALSE"/><param name="ownname" val="SCOTT"/><param name="partname" val=""/><param name="re porting_mode" val="FALSE"/><param name="statid" val=""/><param name="statown" val=""/><par am name="stattab" val=""/><param name="stattype" val="DATA"/><param name="tabname" val="T3 "/></params> --//method_opt=FOR TABLE FOR ALL COLUMNS SIZE 1 5204 2023-08-21 20:40:17.984000 2023-08-21 20:40:23.206000 gather_table_stats SCOTT.T3 COMPLETED <params><param name="block_sample" val="FALSE"/><param name="cascade" val="TRUE"/><param n ame="concurrent" val="FALSE"/><param name="degree" val="NULL"/><param name="estimate_perce nt" val=""/><param name="force" val="FALSE"/><param name="granularity" val="AUTO"/><param name="method_opt" val="FOR TABLE FOR ALL COLUMNS SIZE 254"/><param name="no_invalidate" va l="FALSE"/><param name="ownname" val="SCOTT"/><param name="partname" val=""/><param name=" reporting_mode" val="FALSE"/><param name="statid" val=""/><param name="statown" val=""/><p aram name="stattab" val=""/><param name="stattype" val="DATA"/><param name="tabname" val=" T3"/></params> --//method_opt=FOR TABLE FOR ALL COLUMNS SIZE 254 5223 2023-08-21 20:41:05.161000 2023-08-21 20:41:05.273000 set_table_stats SCOTT.T3 COMPLETED <params><param name="avgrlen" val=""/><param name="cachedblk" val=""/><param name="cachehi t" val=""/><param name="flags" val=""/><param name="force" val="TRUE"/><param name="im_blo ck_count" val=""/><param name="im_imcu_count" val=""/><param name="no_invalidate" val="FAL SE"/><param name="numblks" val=""/><param name="numrows" val="200000"/><param name="ownnam e" val="SCOTT"/><param name="partname" val=""/><param name="scanrate" val=""/><param name= "statid" val=""/><param name="statown" val=""/><param name="stattab" val=""/><param name=" tabname" val="T3"/></params> --//exec dbms_stats.set_table_stats('SCOTT','T3',numrows=>2e5,NO_INVALIDATE=>false,force=>true); 5243 2023-08-21 20:47:56.238000 2023-08-21 20:47:57.563000 restore_table_stats SCOTT.T3 COMPLETED <params><param name="as_of_timestamp" val="08-21-2023 20:41:05"/><param name="force" val=" FALSE"/><param name="no_invalidate" val="FALSE"/><param name="ownname" val="SCOTT"/><param name="restore_cluster_index" val="FALSE"/><param name="tabname" val="T3"/></params> --//实际上执行dbms_stats.set_table_stats,对应th.sql第3条记录。要取消直方图信息,执行如下: SCOTT@test01p> exec dbms_stats.restore_table_stats('SCOTT','T3','2023-08-21 20:40:22',No_Invalidate => false) PL/SQL procedure successfully completed. SCOTT@test01p> @ desczz t1 '' eXtended describe of t1 DISPLAY TABLE_NAME OF COLUMN_NAME INFORMATION. INPUT OWNER.TABLE_NAME <filters> SAMPLE : @ desczz TABLE_NAME column_name1,column_name2 IF NOT INPUT <filters> ,USE "" . Owner Table_Name SAMPLE_SIZE LAST_ANALYZED Col# Column Name Null? Type NUM_DISTINCT Density NUM_NULLS HISTOGRAM NUM_BUCKETS Low_value High_value ----- ---------- ----------- ------------------- ---- ----------- ---------- ------------ ------------ -------------- ---------- --------- ----------- --------- ----------- SCOTT T1 100000 2023-08-19 21:28:26 1 ID NOT NULL NUMBER(,) 100000 .00001000000 0 1 1 100000 100000 2023-08-19 21:28:26 2 NAME VARCHAR2(10) 100000 .00001000000 0 1 AAAlsW zzyuku --//仅仅提醒自己在工作中注意这些细节!!篡改表统计信息时在DBA_TAB_STATS_HISTORY视图有记录。 5.附上执行代码: $ cat opstat.sql column start_time format a26 column end_time format a26 column notes format a90 SELECT id , start_time , end_time , operation , target , status , notes FROM DBA_OPTSTAT_OPERATIONS where target = upper('&&1..&&2') and &&3 order by 1; --//th.sql代码有点长,不贴上来了。 --//来自 [20220421]完善查询表分析的历史th.sql脚本.txt =>http://blog.itpub.net/267265/viewspace-2888146/ --//其它 gts ,modtab,modcol对应脚本都可以在我的blog上查询找到,不贴上来了。 6.疑问: --//按照这个道理12c假设开始ctas脚本的统计信息没有记录,测试看看。 SCOTT@test01p> create table t4 as select rownum id , cast(dbms_random.string('a',6 ) as varchar2(10)) name from dual connect by level <=1e3; Table created. SCOTT@test01p> @ th scott.t4 '' no rows selected -- exec dbms_stats.restore_table_stats('SCOTT','T4','',No_Invalidate => false) SCOTT@test01p> @ opstat scott t4 1=1 no rows selected --//确实没有。 SCOTT@test01p> @ desczz t4 '' eXtended describe of t4 DISPLAY TABLE_NAME OF COLUMN_NAME INFORMATION. INPUT OWNER.TABLE_NAME <filters> SAMPLE : @ desczz TABLE_NAME column_name1,column_name2 IF NOT INPUT <filters> ,USE "" . Owner Table_Name SAMPLE_SIZE LAST_ANALYZED Col# Column Name Null? Type NUM_DISTINCT Density NUM_NULLS HISTOGRAM NUM_BUCKETS Low_value High_value ---------- ---------- ----------- ------------------- ---- ----------- ---------- ------------ ------------ -------------- ---------- --------------- ----------- --------- ---------- SCOTT T4 1000 2023-08-21 21:26:18 1 ID NUMBER(,) 1000 .00100000000 0 1 1 1000 1000 2023-08-21 21:26:18 2 NAME VARCHAR2(10) 1000 .00100000000 0 1 AATULn zzNXdI --//表相关统计信息是存在了。
[20230821]还原表统计信息问题2.txt
来源:这里教程网
时间:2026-03-03 18:58:24
作者:
编辑推荐:
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 直播、AI赋能,美团披着荆棘前行
直播、AI赋能,美团披着荆棘前行
26-03-03 - Oracle 11.2.0.4 创建普通表,区及段默认是否会分配
Oracle 11.2.0.4 创建普通表,区及段默认是否会分配
26-03-03 - 数据库 SQL执行时长
数据库 SQL执行时长
26-03-03 - 数据库内存交换异常 故障报告
数据库内存交换异常 故障报告
26-03-03 - 大模型加持,讯飞智能办公本X3助办公效率再提速
大模型加持,讯飞智能办公本X3助办公效率再提速
26-03-03 - 从线上化走向智能化,数字办公助力企业实现"效率+安全”双提升|爱分析报告
从线上化走向智能化,数字办公助力企业实现"效率+安全”双提升|爱分析报告
26-03-03 - enq:TX – row lock contention产生原因及处理脚本
- Oracle 11G 区管理方式
Oracle 11G 区管理方式
26-03-03 - VMware Workstation RAC共享磁盘与心跳配置
VMware Workstation RAC共享磁盘与心跳配置
26-03-03 - 在大有可为的即时零售赛道上,达达集团迈上了盈利台阶
在大有可为的即时零售赛道上,达达集团迈上了盈利台阶
26-03-03
