1、关于默认采样率
ESTIMATE_PERCENT
:默认值:
9i:100%
10g:DBMS_STATS.AUTO_SAMPLE_SIZE(使用非常小的估计百分比)
11g:DBMS_STATS.AUTO_SAMPLE_SIZE(使用较大的估算百分比 - 100%)
METHOD_OPT:默认值
:
9i:“FOR ALL COLUMNS SIZE 1”,实际上没有详细的列统计。
10g和11g:“FOR ALL COLUMNS SIZE AUTO” - 此设置意味着DBMS_STATS决定哪些列添加直方图,制定更好的计划。
在11g中,使用ESTIMATE_PERCENT的默认值100%,统计信息收集尽可能准确。收集统计信息时间限制,在以前的版本中,100%的样本是不可能的,但是11g实现了一种新的哈希算法来计算统计数据而不是排序(在9i和10g中,“慢”部分通常是排序),这显着提高了收集时间和资源使用。
2、统计信息收集了什么,有什么作用
- table statistics
NUM_ROWS:
NUM_ROWS是计算cardinality的基础,如果该表是嵌套循环联接(nested loops join)的驱动表,表的行数就特别重要,驱动表的行数,决定了被驱动表的扫描次数。
BLOCKS :
表使用的块数,该参数和DB_FILE_MULTIBLOCK_READ_COUNT一块使用,可以计算 全表扫描所需要的IO数量。
AVG_ROW_LEN :
表中记录的平均大小bytes
AVG_SPACE :
平均空闲空间bytes(ANALYZE)
CHAIN_CNT :
行迁移或行链接
-
index statistics
BLEVEL: 从根结点到叶子结点的高度,用来计算叶子结点查找的成本。0表明根块和叶块是一样的。
LEAF_BLOCKS: 用于计算 full index scane及index range scan的成本 。
CLUSTERING_FACTOR
: 基于索引的值计算表中记录的顺序程度。如果该值接近块的数量,表中记录有序存储。在这种情况下,索引条目在单个叶块往往指向相同的数据块中的行。如果该值接近表的行数,表示记录无序存储。在这种情况下,不太可能在同一叶块索引条目指向相同的数据块中的行。
AVG_LEAF_BLOCKS_PER_KEY
: 叶块的平均数量在每一个不同的值出现在索引中,四舍五入为最接近的整数。实施独特的索引和主键约束,这个值总是1(一个)。索引值在不同叶子结点出现的平均数量,在唯一索引和主键约束中,该值为总是这1。
AVG_DATA_BLOCKS_PER_KEY
: 表中数据块指向同一索引值的平均数量。
NUM_ROWS
:
索引中的行数
-
column statistics
NUM_disTINCT :
计算选择性。(例: 1/NDV)
LOW_VALUE and HIGH_VALUE:
对所有数据类型,CBO假设在高值和低值之间是均匀分布的。这些值用于计算范围扫描的选择性。
NUM_NULLS:
对存在空值的列,使用is null 和is not null查询时,计算选择性
DENSITY:
未收集直方图
Density = 1 / Number of distinct NON null values
The number of distinct NON-null values for a column (COL1) on table TABLE1 can be obtained as follows:
select distinct count(COL1) from TABLE1 where COL1 is not null;
收集直方图
A non-popular value is one that does not span multiple bucket end points.
A popular value is one that spans multiple end points.
For non-popular values the density is calculated as the number of non-popular
values divided by the total number of values. Formula:
Density = Number of non-popular values
----------------------------
total number of values
We only use the density statistic for non-popular values.
using histograms as follows:
The Selectivity for popular values is calculated as the number of end points
spanned by that value divided by the total number of end points. Formula:
Selectivity = Number of end points spanned by this value
------------------------------------------
total number of end points
3、练习3:10g和11g自动采样率测试
exec DBMS_STATS.DELETE_TABLE_STATS('HT','A_AMT');
exec dbms_stats.gather_table_stats('HT','A_AMT');
set line 200
col owner for a10
col table_name for a20
col LAST_ANALYZED for a30
SELECT owner,
table_name,
num_rows,
sample_size,
trunc(sample_size / num_rows * 100) estimate_percent,
to_char(LAST_ANALYZED,'yyyy-mm-dd hh34:mi:ss') LAST_ANALYZED
FROM DBA_TAB_STATISTICS
WHERE owner='HT' and table_name='A_AMT';
oracle 10g测试结果
sql> exec dbms_stats.gather_table_stats('HT','A_AMT');
PL/sql procedure successfully completed.
sql> set line 200
sql> col owner for a10
col table_name for a20
col LAST_ANALYZED for a30
SELECT owner,
table_name,
num_rows,
sample_size,
trunc(sample_size / num_rows * 100) estimate_percent,
to_char(LAST_ANALYZED,'yyyy-mm-dd hh34:mi:ss') LAST_ANALYZED
FROM DBA_TAB_STATISTICS
OWNER
TABLE_NAME
NUM_ROWS SAMPLE_SIZE ESTIMATE_PERCENT LAST_ANALYZED
---------- -------------------- ---------- ----------- ---------------- ------------------------------
HT
A_AMT
59968
59968
100 2017-09-22 02:07:47
sql> !date
Fri Sep 22 02:08:00 CST 2017
sql> select version from v$instance;
VERSION
---------------------------------------------------
10.2.0.5.0
sql>
oracle 11g测试结果
OWNER
TABLE_NAME
NUM_ROWS SAMPLE_SIZE ESTIMATE_PERCENT
---------- -------------------- ---------- ----------- ----------------
HT A_AMT 59968 59968
100
4、小结
1、 Oracle 10g可能
使用非常小的估计百分比,建议手工100%收集,至少30%。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。