ITPub博客

首页 > 数据库 > Oracle > [20230818]关于修改字段统计信息问题.txt

[20230818]关于修改字段统计信息问题.txt

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

[20230818]关于修改字段统计信息问题.txt

--//[20221216]建立修改表字段统计信息modcol.sql脚本.txt =>http://blog.itpub.net/267265/viewspace-2932708/
--//如果修改字段一些信息可能导致对应字段的直方图信息破坏,要小心这类修改操作,我忽略这个细节。

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.建立测试表:
SCOTT@test01p> create table t as select rownum id , cast(dbms_random.string('a',6 ) as varchar2(10)) name from dual connect by level <=1e5;
Table created.

SCOTT@test01p> @ pk t id
create unique index pk_t on t (id);
alter table t add constraint pk_t primary key (id);
-- alter table t modify constraint pk_t disable;
-- alter table t drop constraint PK_t;
-- drop index pk_t;
Index created.
Table altered.

SCOTT@test01p> @ gts t 254 ''
@ gts table_name  <method_opt> <estimate_percent>
method_opt accept  R or r  => REPEAT , A or a => auto
estimate_percent accept "" => NULL , AUTO or A or auto or a=> sys.dbms_stats.auto_sample_size
Gather Table Statistics for table t...
exec dbms_stats.gather_table_stats('SCOTT', 'T', estimate_percent => NULL, method_opt=>'FOR TABLE FOR ALL COLUMNS SIZE 254', cascade=>true, no_invalidate=>false)
if lock table t, add force=>true.
press ctrl+c cancel, enter continue...
PL/SQL procedure successfully completed.

SCOTT@test01p> @ desczz t ''
eXtended describe of t

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 T               100000 2023-08-18 21:37:35    1 ID          NOT NULL   NUMBER(,)          100000   .00001000000          0 HYBRID                  254 1         100000
                      100000 2023-08-18 21:37:35    2 NAME                   VARCHAR2(10)       100000   .00001000000          0 HYBRID                  254 AAAFHY    zzzdjE


SCOTT@test01p> @ modcol t name density .00001100000
input argument list : owner.table_name column_name column_stat_attribute value
column_stat_attribute = density distcnt nullcnt avgclen
@desc_proc sys dbms_stats set_column_stats
exec dbms_stats.SET_COLUMN_STATS('SCOTT','T','name',density=>.00001100000,NO_INVALIDATE=>false,force=>true);
press enter to continue ...
PL/SQL procedure successfully completed.

SCOTT@test01p> @ desczz t ''
eXtended describe of t

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      T               100000 2023-08-18 21:37:35    1 ID          NOT NULL   NUMBER(,)          100000   .00001000000          0 HYBRID                  254 1         100000
                           100000 2023-08-18 21:40:52    2 NAME                   VARCHAR2(10)       100000   .00001100000          0                           1 AAAFHY    zzzdjE

--//可以发现字段NAME的Density= .00001100000已经修改,但是直方图信息完全清除了。
--//当然你可以使用这个方法清除对应字段的直方图信息。

SCOTT@test01p> @ tabhist t name
COLUMN_NAME DATA_TYPE Histogram  SAMPLE_SIZE ENDPOINT_NUMBER ENDPOINT_VALUE  FREQUENCY HEIGHT_BAL ENDPOINT_ACTUAL_VALUE
----------- --------- ---------- ----------- --------------- -------------- ---------- ---------- -----------------------
NAME        VARCHAR2  NONE            100000               0   414141464858          0
                      NONE            100000               1   7A7A7A646A44          1

--//可以发现name字段直方图信息已经清除。
SCOTT@test01p> @ gts t 254 '' ''
Gather Table Statistics for table t...
exec dbms_stats.gather_table_stats('SCOTT', 'T', estimate_percent => NULL, method_opt=>'FOR TABLE FOR ALL COLUMNS SIZE 254', cascade=>true, no_invalidate=>false)
if lock table t, add force=>true.
press ctrl+c cancel, enter continue...
PL/SQL procedure successfully completed.

SCOTT@test01p> @ tabhist t name
COLUMN_NAME DATA_TYPE Histogram  SAMPLE_SIZE ENDPOINT_NUMBER ENDPOINT_VALUE  FREQUENCY HEIGHT_BAL ENDPOINT_ACTUAL_VALUE
----------- --------- ---------- ----------- --------------- -------------- ---------- ---------- --------------------------
NAME        VARCHAR2  HYBRID          100000               1   414141464858          1            AAAFHY
                      HYBRID          100000             396   414B4C7A7558        396            AKLzuX
                      HYBRID          100000             791   415554505870        791            AUTPXp
                      HYBRID          100000            1187   4166594F4B4E       1187            AfYOKO
                      HYBRID          100000            1582   41717A456572       1582            AqzEes
                      HYBRID          100000            1977   424257544B78       1977            BBWTKy
....
                      HYBRID          100000           98023   797855426347      98023            yxUBcH
                      HYBRID          100000           98419   7A4A51787270      98419            zJQxrp
                      HYBRID          100000           98814   7A554C564679      98814            zULVFz
                      HYBRID          100000           99209   7A656C414A6C      99209            zelAJl
                      HYBRID          100000           99604   7A6F7674786D      99604            zovtxm
                      HYBRID          100000          100000   7A7A7A646A44     100000            zzzdjE
254 rows selected.

--//仅仅提醒自己工作中注意这样的情况。另外今天还学习到了视图DBA_OPTSTAT_OPERATIONS记录分析统计信息的操作。
--// DBA_TAB_STATS_HISTORY  视图表统计信息的历史,它不会记录dbms_stats.set_table_stats之类的操作。
--// DBA_OPTSTAT_OPERATION_TASKS 视图记录表统计信息操作的细节。

SCOTT@test01p> @ opstat SCOTT T  1=1
        ID START_TIME                 END_TIME                   OPERATION            TARGET               STATUS               NOTES
---------- -------------------------- -------------------------- -------------------- -------------------- -------------------- ------------------------------------------------------------------------------------------
      5042 2023-08-03 21:24:08.706000 2023-08-03 21:24:10.759000 gather_table_stats   SCOTT.T              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 REPEAT"/><param name="no_invalidate"
                                                                                                                                 val="FALSE"/><param name="ownname" val="SCOTT"/><param name="partname" val=""/><param nam
                                                                                                                                e="reporting_mode" val="FALSE"/><param name="statid" val=""/><param name="statown" val=""/
                                                                                                                                ><param name="stattab" val=""/><param name="stattype" val="DATA"/><param name="tabname" va
                                                                                                                                l="T"/></params>

      5143 2023-08-18 21:37:30.870000 2023-08-18 21:37:35.845000 gather_table_stats   SCOTT.T              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="
                                                                                                                                T"/></params>

      5144 2023-08-18 21:50:57.293000 2023-08-18 21:51:01.618000 gather_table_stats   SCOTT.T              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="
                                                                                                                                T"/></params>
SCOTT@test01p> @ tab2 t
Show tables matching condition "t" (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                T                              TAB        100000           246         0      0     12 2023-08-18 21:51:01          1           DISABLED

SCOTT@test01p> @modtab t numblks 250
input argument list : owner.table_name table_stat_attribute value
table_stat_attribute = numrows numblks avgrlen
@desc_proc sys dbms_stats set_table_stats
exec dbms_stats.set_table_stats('SCOTT','T',numblks=>250,NO_INVALIDATE=>false,force=>true);
press enter to continue ...
PL/SQL procedure successfully completed.

SCOTT@test01p> @ opstat SCOTT T  1=1
  ID START_TIME                 END_TIME                   OPERATION            TARGET  STATUS    NOTES
---- -------------------------- -------------------------- -------------------- ------- --------- ------------------------------------------------------------------------------------------
5042 2023-08-03 21:24:08.706000 2023-08-03 21:24:10.759000 gather_table_stats   SCOTT.T 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 REPEAT"/><param name="no_invalidate"
                                                                                                   val="FALSE"/><param name="ownname" val="SCOTT"/><param name="partname" val=""/><param nam
                                                                                                  e="reporting_mode" val="FALSE"/><param name="statid" val=""/><param name="statown" val=""/
                                                                                                  ><param name="stattab" val=""/><param name="stattype" val="DATA"/><param name="tabname" va
                                                                                                  l="T"/></params>

5143 2023-08-18 21:37:30.870000 2023-08-18 21:37:35.845000 gather_table_stats   SCOTT.T 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="
                                                                                                  T"/></params>

5144 2023-08-18 21:50:57.293000 2023-08-18 21:51:01.618000 gather_table_stats   SCOTT.T 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="
                                                                                                  T"/></params>

5162 2023-08-18 22:09:31.377000 2023-08-18 22:09:31.517000 set_table_stats      SCOTT.T 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="250"/><param name="numrows" val=""/><param name="ownname"
                                                                                                  val="SCOTT"/><param name="partname" val=""/><param name="scanrate" val=""/><param name="st
                                                                                                  atid" val=""/><param name="statown" val=""/><param name="stattab" val=""/><param name="tab
                                                                                                  name" val="T"/></params>

--//set_table_stat操作也记录下来。
--//另外我的测试出现1个START_TIME=2023-08-03 21:24:08.706000,很明显这个是以前测试时建立的表,当时已经删除了。

3.测试代码:
$ 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;

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

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

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7971365