ITPub博客

首页 > 数据库 > Oracle > [20230821]还原表统计信息问题2.txt

[20230821]还原表统计信息问题2.txt

原创 Oracle 作者:lfree 时间:2023-08-23 21:04:47 0 删除 编辑

[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

--//表相关统计信息是存在了。

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

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7970834