oracle 11g 扩展统计信息extended_stats
发表于:2025-11-11 作者:千家信息网编辑
千家信息网最后更新 2025年11月11日,oracle 11g在统计信息收集方面增加了扩展统计信息的特性,它可以收集一个表中相关列上的统计信息,也可以收集函数表达式上的 统计信息.使选择率,成本的估计更加准确,也更容易走正确的执行计划.在相关
千家信息网最后更新 2025年11月11日oracle 11g 扩展统计信息extended_statsoracle 11g在统计信息收集方面增加了扩展统计信息的特性,它可以收集一个表中相关列上的统计信息,也可以收集函数表达式上的
统计信息.使选择率,成本的估计更加准确,也更容易走正确的执行计划.在相关列上收集统计信息,好处还是很明显的.例如两列在逻辑
上有一定的关系,但如果只是对这两个列单独做统计信息的收集,根据多条件的选择率计算{(A AND B的选择率为:OPSEL[a]*OPSEL[b]);
(A OR B 的选择率为:OPSEL[a]+OPSEL[b]-OPSEL[a]OPSEL[b]);(NOT A的选择率为:1-OPSEL[a])},估算出来的选择率就可能偏差很大.
以下测试:
DB Version:11.2.0.4
----产生测试数据
drop table scott.test01 purge;
create table scott.test01
as select * from dba_objects;
--把object_name 更新为和object_type一样,用于测试.
update scott.test01
set object_name=object_type;
commit;
1.收集单列统计信息,查看执行计划
--收集单列统计信息
begin
dbms_stats.gather_table_stats('scott','test01');
end;
--查看表的行数
select table_name,num_rows from dba_tables
where owner = 'SCOTT' and table_name = 'TEST01';
/*
TABLE_NAME NUM_ROWS
TEST01 87212
*/
--产生语句的执行计划
explain plan for select * from scott.test01 where object_name='INDEX' and object_type='INDEX';
SELECT lpad(' ', 2 * (LEVEL - 1)) || operation operation,
options,
object_name,
cardinality,
bytes,
io_cost,
cpu_cost,
cost,
time
FROM plan_table
START WITH id = 0
CONNECT BY PRIOR id = parent_id;
/*
OPERATION OPTIONS OBJECT_NAME CARDINALITY BYTES IO_COST CPU_COST COST TIME
SELECT STATEMENT 41 3362 347 35338490 348 5
TABLE ACCESS FULL TEST01 41 3362 347 35338490 348 5
*/
这里可以看到,估算的返回行数是41,显然和实际相差很远
rollback;
--行数估算
select rpad(column_name, 30, ' ') column_name,
rpad(num_distinct, 8, ' ') num_distinct,
rpad(utl_raw.cast_to_varchar2(low_value), 15, ' ') low_value,
rpad(utl_raw.cast_to_varchar2(high_value), 10, ' ') high_value,
rpad(num_nulls, 8, ' ') num_nulls,
rpad(avg_col_len, 6, ' ') avg_col_len,
rpad(density, 20, ' ') density,
histogram
from dba_tab_col_statistics
where owner = 'SCOTT'
and table_name = 'TEST01'
and column_name in ('OBJECT_NAME','OBJECT_TYPE');
/*
COLUMN_NAME NUM_DISTINCT LOW_VALUE HIGH_VALUE NULLABLE NUM_NULLS AVG_COL_LEN DENSITY HISTOGRAM
OBJECT_NAME 46 CLUSTER XML SCHEMA Y 0 9 .0217391304347826 NONE
OBJECT_TYPE 46 CLUSTER XML SCHEMA Y 0 9 .0217391304347826 NONE
*/
估算的返回行数是41,是由两个列的density相乘再乘以表的行数得到,.0217391304347826*.0217391304347826*87212=41.2155009451796=41
2.收集多列扩展统计信息,查看执行计划
--收集多列扩展统计信息
begin
dbms_stats.gather_table_stats('scott','test01',method_opt =>'for columns (object_name,object_type)');
end;
--产生语句的执行计划
explain plan for select * from scott.test01 where object_name='INDEX' and object_type='INDEX';
SELECT lpad(' ', 2 * (LEVEL - 1)) || operation operation,
options,
object_name,
cardinality,
bytes,
io_cost,
cpu_cost,
cost,
time
FROM plan_table
START WITH id = 0
CONNECT BY PRIOR id = parent_id;
/*
OPERATION OPTIONS OBJECT_NAME CARDINALITY BYTES IO_COST CPU_COST COST TIME
SELECT STATEMENT 5303 498482 347 36285951 348 5
TABLE ACCESS FULL TEST01 5303 498482 347 36285951 348 5
*/
这里可以看到,估算的返回行数是5303,已经基本上和实际返回行数相近.
PS:
1.扩展统计信息的收集,可以用select dbms_stats.create_extended_stats('scott','test01','(object_name,object_type)')from dual
创建扩展统计列,然后dbms_stats.gather_table_stats('scott','test01')收集统计信息,也可以直接在
dbms_stats.gather_table_stats中的method_opt属性同时建立扩展统计又收集统计数据.
2.oracle 11g不仅可以收集多列扩展统计信息,还可以收集函数和表达式的扩展统计信息.
统计信息.使选择率,成本的估计更加准确,也更容易走正确的执行计划.在相关列上收集统计信息,好处还是很明显的.例如两列在逻辑
上有一定的关系,但如果只是对这两个列单独做统计信息的收集,根据多条件的选择率计算{(A AND B的选择率为:OPSEL[a]*OPSEL[b]);
(A OR B 的选择率为:OPSEL[a]+OPSEL[b]-OPSEL[a]OPSEL[b]);(NOT A的选择率为:1-OPSEL[a])},估算出来的选择率就可能偏差很大.
以下测试:
DB Version:11.2.0.4
----产生测试数据
drop table scott.test01 purge;
create table scott.test01
as select * from dba_objects;
--把object_name 更新为和object_type一样,用于测试.
update scott.test01
set object_name=object_type;
commit;
1.收集单列统计信息,查看执行计划
--收集单列统计信息
begin
dbms_stats.gather_table_stats('scott','test01');
end;
--查看表的行数
select table_name,num_rows from dba_tables
where owner = 'SCOTT' and table_name = 'TEST01';
/*
TABLE_NAME NUM_ROWS
TEST01 87212
*/
--产生语句的执行计划
explain plan for select * from scott.test01 where object_name='INDEX' and object_type='INDEX';
SELECT lpad(' ', 2 * (LEVEL - 1)) || operation operation,
options,
object_name,
cardinality,
bytes,
io_cost,
cpu_cost,
cost,
time
FROM plan_table
START WITH id = 0
CONNECT BY PRIOR id = parent_id;
/*
OPERATION OPTIONS OBJECT_NAME CARDINALITY BYTES IO_COST CPU_COST COST TIME
SELECT STATEMENT 41 3362 347 35338490 348 5
TABLE ACCESS FULL TEST01 41 3362 347 35338490 348 5
*/
这里可以看到,估算的返回行数是41,显然和实际相差很远
rollback;
--行数估算
select rpad(column_name, 30, ' ') column_name,
rpad(num_distinct, 8, ' ') num_distinct,
rpad(utl_raw.cast_to_varchar2(low_value), 15, ' ') low_value,
rpad(utl_raw.cast_to_varchar2(high_value), 10, ' ') high_value,
rpad(num_nulls, 8, ' ') num_nulls,
rpad(avg_col_len, 6, ' ') avg_col_len,
rpad(density, 20, ' ') density,
histogram
from dba_tab_col_statistics
where owner = 'SCOTT'
and table_name = 'TEST01'
and column_name in ('OBJECT_NAME','OBJECT_TYPE');
/*
COLUMN_NAME NUM_DISTINCT LOW_VALUE HIGH_VALUE NULLABLE NUM_NULLS AVG_COL_LEN DENSITY HISTOGRAM
OBJECT_NAME 46 CLUSTER XML SCHEMA Y 0 9 .0217391304347826 NONE
OBJECT_TYPE 46 CLUSTER XML SCHEMA Y 0 9 .0217391304347826 NONE
*/
估算的返回行数是41,是由两个列的density相乘再乘以表的行数得到,.0217391304347826*.0217391304347826*87212=41.2155009451796=41
2.收集多列扩展统计信息,查看执行计划
--收集多列扩展统计信息
begin
dbms_stats.gather_table_stats('scott','test01',method_opt =>'for columns (object_name,object_type)');
end;
--产生语句的执行计划
explain plan for select * from scott.test01 where object_name='INDEX' and object_type='INDEX';
SELECT lpad(' ', 2 * (LEVEL - 1)) || operation operation,
options,
object_name,
cardinality,
bytes,
io_cost,
cpu_cost,
cost,
time
FROM plan_table
START WITH id = 0
CONNECT BY PRIOR id = parent_id;
/*
OPERATION OPTIONS OBJECT_NAME CARDINALITY BYTES IO_COST CPU_COST COST TIME
SELECT STATEMENT 5303 498482 347 36285951 348 5
TABLE ACCESS FULL TEST01 5303 498482 347 36285951 348 5
*/
这里可以看到,估算的返回行数是5303,已经基本上和实际返回行数相近.
PS:
1.扩展统计信息的收集,可以用select dbms_stats.create_extended_stats('scott','test01','(object_name,object_type)')from dual
创建扩展统计列,然后dbms_stats.gather_table_stats('scott','test01')收集统计信息,也可以直接在
dbms_stats.gather_table_stats中的method_opt属性同时建立扩展统计又收集统计数据.
2.oracle 11g不仅可以收集多列扩展统计信息,还可以收集函数和表达式的扩展统计信息.
统计
信息
选择
测试
两个
函数
实际
数据
表达式
语句
很大
明显
相近
偏差
只是
同时
好处
属性
成本
方面
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
世界好玩又有趣的生存服务器
采用汽车车载网络技术可以
我的世界服务器付费插件
网络安全公司 奔
dnf谷歌服务器连接不到
合肥升腾服务器价格
开发安卓 软件开发
网络安全委员电话
赵武 网络安全
录屏视频提示服务器运行失败
软件开发客户怎么样
计算机网络技术一应用
java连接2个数据库
软考数据库应用技术
互联网科技博览会奖项
广东网络安全宣传周线上平台
珠海考试软件开发订制
互联网和高科技有什么区别
安卓的软件开发多少钱
电脑服务器的管理员权限
网络安全二次安防
网络安全性能分析
计算机网络技术1500字
单选修改数据库的命令可以是
数据库怎么弄还贷金额
有教app软件开发的技校吗
法制公众号题目网络安全
怎么进入微服务的数据库
瀚高数据库如何查看数据库兼容性
数据库第五版王珊课后习题答案