注册
如何收集模式下对象的统计信息
专栏/培训园地/ 文章详情 /

如何收集模式下对象的统计信息

DM_185806 2024/06/21 610 0 0
摘要

1.创建临时存统计信息表:
DBMS_STATS.CREATE_STAT_TABLE('SYSDBA', 'OADB_ALLTB');

复制
2.收集用户统计信息:
DBMS_STATS.GATHER_SCHEMA_STATS('TEST',100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
复制
3.导出统计信息
DECLARE
BEGIN
FOR RS IN (SELECT OWNER,TABLE_NAME FROM DBA_TABLES WHERE OWNER IN ('TEST'))
LOOP
DBMS_STATS.EXPORT_TABLE_STATS(RS.OWNER,RS.TABLE_NAME,NULL,'OADB_ALLTB','table stats',true);
END LOOP;
END;
/
复制
4.查看表结构:(可选)
SP_TABLEDEF ('SYSDBA','STAT$_OADB_ALLTB');
结果如下:
CREATE TABLE "SYSDBA"."STAT$_OADB_ALLTB"
(
"STATID" VARCHAR(128) NOT NULL,
"OWNNAME" VARCHAR(128) NOT NULL,
"TABNAME" VARCHAR(128) NOT NULL,
"NAME" VARCHAR(128) NOT NULL,
"T_FLAG" CHAR(1) NOT NULL,
"T_TOTAL" BIGINT,
"N_SAMPLE" BIGINT,
"N_DISTINCT" BIGINT,
"N_NULL" BIGINT,
"V_MIN" VARBINARY(255),
"V_MAX" VARBINARY(255),
"BLEVEL" TINYINT,
"N_LEAF_PAGES" BIGINT,
"N_LEAF_USED_PAGES" BIGINT,
"CLUSTER_FACTOR" INT,
"N_BUCKETS" SMALLINT,
"DATA" BLOB,
"COL_AVG_LEN" INT,
"LAST_GATHERED" DATETIME(6),
"INFO1" VARBINARY(255),
"INFO2" VARBINARY(255),
NOT CLUSTER PRIMARY KEY("STATID", "OWNNAME", "TABNAME", "NAME", "T_FLAG"))
STORAGE(ON "MAIN", CLUSTERBTR)
DISTRIBUTED BY HASH ("STATID", "OWNNAME", "TABNAME", "NAME", "T_FLAG") ;

复制
5.通过dmfldr导出txt
LOAD DATA
INFILE '/dm8/fldr/stats.txt'
INTO TABLE "SYSDBA"."STAT$_OADB_ALLTB"
FIELDS '|'
复制
6.操作步骤:
SQL> DBMS_STATS.CREATE_STAT_TABLE('SYSDBA', 'OADB_ALLTB');

SQL> SELECT COUNT (*) FROM STAT$_OADB_ALLTB;

行号 COUNT(*)


1 0

SQL> DBMS_STATS.GATHER_SCHEMA_STATS('TEST',100,TRUE,'FOR ALL COLUMNS SIZE AUTO');

SQL> DECLARE
2 BEGIN
3 FOR RS IN (SELECT OWNER,TABLE_NAME FROM DBA_TABLES WHERE OWNER IN ('TEST'))
4 LOOP
5 DBMS_STATS.EXPORT_TABLE_STATS(RS.OWNER,RS.TABLE_NAME,NULL,'OADB_ALLTB','table stats',true);
6 END LOOP;
7 END;
8 /
警告: 在集函数中计算NULL值
DMSQL 过程已成功完成
已用时间: 270.512(毫秒). 执行号:506.
SQL> SELECT COUNT (*) FROM STAT$_OADB_ALLTB;

行号 COUNT(*)


1 269

已用时间: 0.475(毫秒). 执行号:507.
SQL>
SQL>
SQL> desc STAT$_OADB_ALLTB;

行号 NAME TYPE$ NULLABLE


1 STATID VARCHAR(128) N
2 OWNNAME VARCHAR(128) N
3 TABNAME VARCHAR(128) N
4 NAME VARCHAR(128) N
5 T_FLAG CHAR(1) N
6 T_TOTAL BIGINT Y
7 N_SAMPLE BIGINT Y
8 N_DISTINCT BIGINT Y
9 N_NULL BIGINT Y
10 V_MIN VARBINARY(255) Y
11 V_MAX VARBINARY(255) Y

行号 NAME TYPE$ NULLABLE


12 BLEVEL TINYINT Y
13 N_LEAF_PAGES BIGINT Y
14 N_LEAF_USED_PAGES BIGINT Y
15 CLUSTER_FACTOR INTEGER Y
16 N_BUCKETS SMALLINT Y
17 DATA BLOB Y
18 COL_AVG_LEN INTEGER Y
19 LAST_GATHERED DATETIME(6) Y
20 INFO1 VARBINARY(255) Y
21 INFO2 VARBINARY(255) Y

21 rows got

已用时间: 6.287(毫秒). 执行号:508.
SQL>
SQL> SP_TABLEDEF ('SYSDBA','STAT$_OADB_ALLTB');

行号 COLUMN_VALUE


1 CREATE TABLE "SYSDBA"."STAT$_OADB_ALLTB" ( "STATID" VARCHAR(128) NOT NULL, "OWNNAME" VARCHAR(128) NOT NULL, "TABNAME" VARCHAR(128) NOT NULL, "NAME" VARCHAR(128) NOT NULL, "T_FLAG" CHAR(1) NOT NULL, "T_TOTAL" BIGINT, "N_SAMPLE" BIGINT, "N_DISTINCT" BIGINT, "N_NULL" BIGINT, "V_MIN" VARBINARY(255), "V_MAX" VARBINARY(255), "BLEVEL" TINYINT, "N_LEAF_PAGES" BIGINT, "N_LEAF_USED_PAGES" BIGINT, "CLUSTER_FACTOR" INT, "N_BUCKETS" SMALLINT, "DATA" BLOB, "COL_AVG_LEN" INT, "LAST_GATHERED
2 " DATETIME(6), "INFO1" VARBINARY(255), "INFO2" VARBINARY(255), NOT CLUSTER PRIMARY KEY("STATID", "OWNNAME", "TABNAME", "NAME", "T_FLAG")) STORAGE(ON "MAIN", CLUSTERBTR) DISTRIBUTED BY HASH ("STATID", "OWNNAME", "TABNAME", "NAME", "T_FLAG") ;

已用时间: 1.318(毫秒). 执行号:509.

[dmdba@localhost stats]$ cat stats.ctl
LOAD DATA
INFILE '/dm8/fldr/stats/stats.txt'
INTO TABLE "SYSDBA"."STAT$_OADB_ALLTB"
FIELDS '|'
[dmdba@localhost stats]$
[dmdba@localhost stats]$
[dmdba@localhost stats]$ /dm8/bin/dmfldr sysdba/dameng123@192.168.52.188:5336 control='/dm8/fldr/stats/stats.ctl' lob_directory='/dm8/fldr/stats' mode='out'
dmfldr V8
269 rows is load out
export success.
269 行数据已导出
用时:49.965(ms)

[dmdba@localhost stats]$ ll
总用量 76
-rw-r--r-- 1 dmdba dinstall 20694 5月 31 13:51 dmfldr.lob
-rw-r--r-- 1 dmdba dinstall 218 5月 31 13:51 fldr.log
-rw-r--r-- 1 dmdba dinstall 95 5月 31 13:50 stats.ctl
-rw-r--r-- 1 dmdba dinstall 42212 5月 31 13:51 stats.txt
[dmdba@localhost stats]$ head stats.txt
table stats|TEST|T1|T1|T|300|0|0|0|||0|5|5|0|0|dmfldr.lob:0:8|-1|2023-05-31 13:37:32.659||
table stats|TEST|T1|ID|C|300|300|300|0|01000000|2c010000|0|4|4|0|300|dmfldr.lob:8:2408|4|2023-05-31 13:37:32.663|||
table stats|TEST|T1|NAME|C|300|300|300|0|06000000434343333030|06000000454545453939|0|4|4|0|300|dmfldr.lob:2416:4399|6|2023-05-31 13:37:32.665||
table stats|TEST|T1|INDEX33555885|I|300|300|300|0|01000000|2c010000|0|4|4|0|300|dmfldr.lob:6815:2408|4|2023-05-31 13:37:32.671|1 13:37:32.665|||
table stats|TEST|MLOG$_T1|MLOG$_T1|T|0|0|0|0|0|||0|1|1|0|0|dmfldr.lob:9223:8|-1|2023-05-31 13:37:32.659|023-05-31 13:37:32.671|| 13:37:32.665||
table stats|TEST|T1_PN|T1_PN|T|1|0|0|0|0|0|0|1|1|0|0|dmfldr.lob:9231:8|-1|2023-05-31 13:37:32.653|2.659|023-05-31 13:37:3|.671|| 13:37:32.665|
table stats|TEST|T1_PN|ID|C|1|1|1|0|2c010000|2c010000|0|1|1|0|1|dmfldr.lob:9239:16|4|2023-05-31 13:37:32.655|5-31 13:37:3|.671|| 13:|7:32.665||
table stats|TEST|T1_PN|NAME|C|1|1|1|0|06000000434343333030|06000000434343333030|0|1|1|0|1|dmfldr.lob:9255:22|6|2023-05-31 13:37:32.658|32.665||||
table stats|TEST|T1_PN|INDEX33555889|I|1|1|1|0|2c010000|2c010000|0|1|1|0|1|dmfldr.lob:9277:16|4|2023-05-31 13:37:32.671|1 13:37:32.658|32.665|||||
table stats|TEST|T1_P3|T1_P3|T|100|0|0|0|1|1|0|1|1|0|0|dmfldr.lob:9293:8|-1|2023-05-31 13:37:32.646|-05-31 13:37:32.671|1 1|:37:32.658|32.665||

复制
也可以通过dts工具
image.png
image.png
当然如果是为了迁移统计信息,还可以通过dexp/dimp方式。
先导入STAT$_OADB_ALLTB表信息,最后导入统计信息即可。
导入统计信息参考:

--还原统计信息,使用SYSDBA用户登陆数据库,执行下面备份语句
语法:DBMS_STATS.IMPORT_TABLE_STATS(OWNNAME, TABNAME, PARTNAME, STATTAB, STATID, CASCADE, STATOWN, NO_INVALIDATE, FORCE, STAT_CATEGORY);
参数详解
OWNNAME 目标表的模式名,区分大小写。
TABNAME 目标表名,区分大小写。
PARTNAME 目标表分区名,如果不指定分区,则一起导出所有子表的统计信息,缺省为NULL。
STATTAB 统计信息表名,区分大小写。
STATID 由用户指定的统计信息标识名,缺省为空字符串。
CASCADE 是否连列和索引的统计信息一起导出,缺省为 TRUE
STATOWN 统计信息表的模式名,区分大小写,缺省为 NULL。
NO_INVALIDATE 是否让依赖游标失效,缺省为 TRUE。
FORCE 仅保留参数以兼容 ORACLE,功能暂未实现。
STAT_CATEGORY 仅保留参数以兼容 ORACLE,功能暂未实现。
---单表
DBMS_STATS.IMPORT_TABLE_STATS('OA', 'OA_TABLE1', NULL, 'OADB_ALLTB', 'import stats test', TRUE, 'SYSDBA');
---多表
DECLARE
BEGIN
FOR RS IN (SELECT OWNER,TABLE_NAME FROM DBA_TABLES WHERE OWNER IN ('SYSDBA','USER2'))
LOOP
BEGIN
DBMS_STATS.IMPORT_TABLE_STATS(RS.OWNER,RS.TABLE_NAME,NULL,'OADB_ALLTB','TABLE STATS',TRUE);
EXCEPTION
WHEN OTHERS THEN
PRINT ('OWNER:' || RS.OWNER);
PRINT ('TABLE_NAME:' || RS.TABLE_NAME);
PRINT ('CODE: ' || SQLCODE);
PRINT ('ERRM: ' || SQLERRM);
END;
END LOOP;
END;
/
复制
7.相关参考文档:
https://eco.dameng.com/document/dm/zh-cn/ops/performance-optimization
https://eco.dameng.com/document/dm/zh-cn/pm/dbms_stats-package
https://blog.csdn.net/qq_35273918/article/details/129398284
https://eco.dameng.com/community/post/202212091238397NIH3M0RMXZ0PBM5UO

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服