问题描述
嗨,汤姆,
我想在一个大表上收集统计信息,因此我想编写一个过程,根据存储在配置表中的参数来收集统计信息。
以下版本是否会产生相同的结果?
版本1 :
==========
过程收集统计信息
(
所有者IN varchar2 ,
table_name IN VARCHAR2 ,
part_name IN varchar2 ,
百分比数字,
不使BOOLEAN默认值为TRUE ,
varchar2中的粒度默认为“Auto”,
in_方法_opt IN varchar2默认值“FOR所有列大小AUTO”
)是
w_%数字;
w_度数;
开始
DBMS_STATS.SET_ TABLE_PREFS (所有者, table_name,'INCREMAL','TRUE') ;
w_% := DBMS_STATS.TO_ESTIATE_PERCOR_TYPE ('DBMS_STATS.AUTO_SAMLE_S大小') ;
w_度:= DBMS_STATS.TO_DEGREE_TYPE ('DBMS_STATS.AUTO_DEGREE') ;
dbms_stats.gather_table_stats
(
所有者,
table_name ,
粒度=>上(粒度) ,
部件名称=>部件名称,
级联=>真,
估计百分比=>w_percent ,
no_in无效=>no_in无效,
方法_opt=>in_方法_opt ,
度=>w_°
);
例外
当别人那么
areamer_appal_错误(-20001,'遇到错误-'||SQLCODE||'-错误-'||SQLERRM) ;
结束;
版本2 :
==========
过程收集统计信息
(
所有者IN varchar2 ,
table_name IN VARCHAR2 ,
part_name IN varchar2 ,
百分比数字,
不使BOOLEAN默认值为TRUE ,
varchar2中的粒度默认为“Auto”,
in_方法_opt IN varchar2默认值“FOR所有列大小AUTO”
)是
w_%数字;
w_度数;
开始
DBMS_STATS.SET_ TABLE_PREFS (所有者, table_name,'INCREMAL','TRUE') ;
dbms_stats.gather_table_stats
(
所有者,
table_name ,
粒度=>上(粒度) ,
部件名称=>部件名称,
级联=>真,
估测百分比=>DBMS_STATS.AUTO_SAMLE_SZ ,
no_in无效=>no_in无效,
方法_opt=>in_方法_opt ,
度=>DBMS_STATS.AUTO_DEGREE
);
例外
当别人那么
areamer_appal_错误(-20001,'遇到错误-'||SQLCODE||'-错误-'||SQLERRM) ;
结束;
我的怀疑
=========
如果我使用版本1 , w_percent和w_°的值将分别始终为0和32768 ,因为我在触发以下查询时看到这一点:
SQL>从对偶选择DBMS_STATS.TO_DEGREE_TYPE ('DBMS_STATS.AUTO_DEGREE') ;
DBMS_STATS.TO_DEGREE_TYPE('DBMS_STATS.AUTO_DEGREE')
---------------------------------------------------
32768
SQL>从双通道中选择DBMS_STATS.TO_ESTIATE_PERC_TYPE ('DBMS_STATS.AUTO_SAMLE_SS的大小') ;
DBMS_STATS.TO_ESTIATE_PERCOR_TYPE ('DBMS_STATS.AUTO_SAMLE_S大小')
--------------------------------------
0
而在版本2中, DBMS_STATS.AUTO_DEGREE和DBMS_STATS.AUTO_SAMLE_SZ的值将根据对象的大小、CPU数量和初始化参数来设置?
如果有意义的话,请告诉我
谢谢
卓扬
我想在一个大表上收集统计信息,因此我想编写一个过程,根据存储在配置表中的参数来收集统计信息。
以下版本是否会产生相同的结果?
版本1 :
==========
过程收集统计信息
(
所有者IN varchar2 ,
table_name IN VARCHAR2 ,
part_name IN varchar2 ,
百分比数字,
不使BOOLEAN默认值为TRUE ,
varchar2中的粒度默认为“Auto”,
in_方法_opt IN varchar2默认值“FOR所有列大小AUTO”
)是
w_%数字;
w_度数;
开始
DBMS_STATS.SET_ TABLE_PREFS (所有者, table_name,'INCREMAL','TRUE') ;
w_% := DBMS_STATS.TO_ESTIATE_PERCOR_TYPE ('DBMS_STATS.AUTO_SAMLE_S大小') ;
w_度:= DBMS_STATS.TO_DEGREE_TYPE ('DBMS_STATS.AUTO_DEGREE') ;
dbms_stats.gather_table_stats
(
所有者,
table_name ,
粒度=>上(粒度) ,
部件名称=>部件名称,
级联=>真,
估计百分比=>w_percent ,
no_in无效=>no_in无效,
方法_opt=>in_方法_opt ,
度=>w_°
);
例外
当别人那么
areamer_appal_错误(-20001,'遇到错误-'||SQLCODE||'-错误-'||SQLERRM) ;
结束;
版本2 :
==========
过程收集统计信息
(
所有者IN varchar2 ,
table_name IN VARCHAR2 ,
part_name IN varchar2 ,
百分比数字,
不使BOOLEAN默认值为TRUE ,
varchar2中的粒度默认为“Auto”,
in_方法_opt IN varchar2默认值“FOR所有列大小AUTO”
)是
w_%数字;
w_度数;
开始
DBMS_STATS.SET_ TABLE_PREFS (所有者, table_name,'INCREMAL','TRUE') ;
dbms_stats.gather_table_stats
(
所有者,
table_name ,
粒度=>上(粒度) ,
部件名称=>部件名称,
级联=>真,
估测百分比=>DBMS_STATS.AUTO_SAMLE_SZ ,
no_in无效=>no_in无效,
方法_opt=>in_方法_opt ,
度=>DBMS_STATS.AUTO_DEGREE
);
例外
当别人那么
areamer_appal_错误(-20001,'遇到错误-'||SQLCODE||'-错误-'||SQLERRM) ;
结束;
我的怀疑
=========
如果我使用版本1 , w_percent和w_°的值将分别始终为0和32768 ,因为我在触发以下查询时看到这一点:
SQL>从对偶选择DBMS_STATS.TO_DEGREE_TYPE ('DBMS_STATS.AUTO_DEGREE') ;
DBMS_STATS.TO_DEGREE_TYPE('DBMS_STATS.AUTO_DEGREE')
---------------------------------------------------
32768
SQL>从双通道中选择DBMS_STATS.TO_ESTIATE_PERC_TYPE ('DBMS_STATS.AUTO_SAMLE_SS的大小') ;
DBMS_STATS.TO_ESTIATE_PERCOR_TYPE ('DBMS_STATS.AUTO_SAMLE_S大小')
--------------------------------------
0
而在版本2中, DBMS_STATS.AUTO_DEGREE和DBMS_STATS.AUTO_SAMLE_SZ的值将根据对象的大小、CPU数量和初始化参数来设置?
如果有意义的话,请告诉我
谢谢
卓扬
专家解答
我建议在11g和更高版本中,只使用所有者、table_name和可选的程度。
然后,您只需为该阶数set_table_prefs即可:
http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_stats.htm#sthref8804
然后,您又回到仅仅声明所有者和table_name。
不要设置估计百分比,如果您这样做-它将使用旧的(较慢,较不精确) 10g方法计算统计数据。在11g中,您会发现自动示例几乎总是执行一个计算,它获得的统计信息等于计算统计信息-比10g中的估计更快。
只需启用一次增量统计信息-当您创建表,然后直接调用dbms_stats时。没有理由通过一个存储过程来隐藏调用,该存储过程只是在出错时在字符串中隐藏真正的错误消息(为什么当其他人??????????为什么从调用例程中删除信息??? )
然后,您只需为该阶数set_table_prefs即可:
http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_stats.htm#sthref8804
然后,您又回到仅仅声明所有者和table_name。
不要设置估计百分比,如果您这样做-它将使用旧的(较慢,较不精确) 10g方法计算统计数据。在11g中,您会发现自动示例几乎总是执行一个计算,它获得的统计信息等于计算统计信息-比10g中的估计更快。
只需启用一次增量统计信息-当您创建表,然后直接调用dbms_stats时。没有理由通过一个存储过程来隐藏调用,该存储过程只是在出错时在字符串中隐藏真正的错误消息(为什么当其他人??????????为什么从调用例程中删除信息??? )
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




