注册
大库统计信息收集策略分享
专栏/技术分享/ 文章详情 /

大库统计信息收集策略分享

DM_201195 2025/04/18 224 0 0
摘要

一般情况下,数据库大于500G以上,为避免统计信息收集时间过长影响数据库的性能,就可以考虑对数据库的统计信息收集策略进行调整,建议按表的记录数按比例进行收集。下面是一个参考范例,大家可以进行参考。

/**
(1)HAGR_HASH_SIZE ,为HAGR 操作时,建立 HASH 表的桶个数。有效值范围(10000~100000000) ,默认值为 100000,当HAGR_HASH_SIZE大小与表行数一致时,统计信息收集效率一般为最高。
(2)HAGR_BUF_GLOBAL_SIZE:系统级参数,控制所有哈希分组操作的内存总缓存大小(以M为单位)。
建议值:内存足够的情况下,可以适当调大。实际使用大小由包含哈希分组操作的并发数决定。
调整方法:
根据服务器内存大小调整,例如:
32G内存:2000M
64G内存:4000M
128G内存:8000M
256G内存:15000M
增大该参数值,以减少内存分配冲突,提升并发性能。

(3)HAGR_BUF_SIZE:单个哈希分组操作的内存缓存大小(以M为单位)。
建议值:在处理大表的哈希分组时,可以适当调大。
调整方法:
OLAP环境下,可以根据参与哈希分组的数据量调大。
默认情况下,HAGR_BUF_SIZE应小于或等于HAGR_BUF_GLOBAL_SIZE。
例如:
32G内存:500M
64G内存:1000M
128G内存:1000M
256G内存:1000M
**/

declare
vCnt BIGINT := 0; --表记录数
vHargHashSizeValue BIGINT ; --HAGR_HASH_SIZE 参数中的当前值
vHargHashSizeMaxValue BIGINT ; --HAGR_HASH_SIZE 参数中最大值
vHargBufGlobalSize bigint; --HAGR_BUF_GLOBAL_SIZE 参数值
vSql varchar2(200); --用于存放查询表记录数的sql
vSql1 varchar2(1000); --用于存放设置当前会话的 HAGR_HASH_SIZE 值的sql
vSql2 varchar2(1000); --用于存放当前表统计信息收集的sql
begin
–获取当前的HAGR_BUF_GLOBAL_SIZE值;
select para_value into vHargBufGlobalSize from V$DM_INI WHERE PARA_NAME=‘HAGR_BUF_GLOBAL_SIZE’;

–调大HAGR_BUF_GLOBAL_SIZE的值 M
sp_set_para_value(1,‘HAGR_BUF_GLOBAL_SIZE’,8000);

–设置HAGR_BUF_SIZE的会话值M
SF_SET_SESSION_PARA_VALUE(‘HAGR_BUF_SIZE’,500);

–获取当前harg_hash_size的值以及最大值
SELECT PARA_VALUE,
MAX_VALUE
into
vHargHashSizeValue,
vHargHashSizeMaxValue
FROM V$DM_INI
WHERE PARA_NAME=‘HAGR_HASH_SIZE’;

–获取所有表名,并循环做统计信息收集
FOR RS IN (SELECT table_name
FROM DBA_TABLES
WHERE OWNER =‘SYSDBA’
and table_name not in (‘过滤的表名’) )
LOOP
–获取当前表的行数
vSql := ‘select count(*) from SYSDBA."’||rs.table_name||’"’;
execute IMMEDIATE vSql into vCnt ;

–仅收集记录数大于100行的表
if vCnt >100 then
–根据行数设置 HARG_HASH_SIZE的大小
if vCnt <= vHargHashSizeValue then
vSql1 := ‘SF_SET_SESSION_PARA_VALUE(’‘HAGR_HASH_SIZE’’,’||vHargHashSizeValue||’);’;
elseif vCnt > vHargHashSizeValue and vCnt < vHargHashSizeMaxValue then
vSql1 := ‘SF_SET_SESSION_PARA_VALUE(’‘HAGR_HASH_SIZE’’,’||vCnt||’);’;
else
vSql1 := ‘SF_SET_SESSION_PARA_VALUE(’‘HAGR_HASH_SIZE’’,’||vHargHashSizeMaxValue||’);’;
end if;
–根据行数设置统计信息收集的比例
if vCnt <= 20000000 then
vSql2 := ‘DBMS_STATS.GATHER_TABLE_STATS(’‘SYSDBA’’,’’’||rs.table_name||’’’,null,100,FALSE,’‘FOR ALL COLUMNS SIZE AUTO’’,8);’ ;
elseif vCnt <= 100000000 THEN
vSql2 := ‘DBMS_STATS.GATHER_TABLE_STATS(’‘SYSDBA’’,’’’||rs.table_name||’’’,null,30,FALSE,’‘FOR ALL COLUMNS SIZE AUTO’’,8);’ ;
else
vSql2 := ‘DBMS_STATS.GATHER_TABLE_STATS(’‘SYSDBA’’,’’’||rs.table_name||’’’,null,10,FALSE,’‘FOR ALL COLUMNS SIZE AUTO’’,8);’ ;
end if;
–执行
execute immediate vSql1;
execute immediate vSql2;
end if;
end loop;
–调回HAGR_BUF_GLOBAL_SIZE的值
sp_set_para_value(1,‘HAGR_BUF_GLOBAL_SIZE’,vHargBufGlobalSize);
end;

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服