我只是想知道这些值是否总是正确的,如果你有一个500k行值为1的列,500k行值为5和1行值1000,LOW_VALUE应该是1(转换后)原始数字)和HIGH_VALUE应为1000(转换原始数字后).但是,在任何情况下Oracle都会“错过”此异常值,而对于HIGH_VALUE则为5吗?
另外,这两个值的目的是什么?
谢谢
与所有与优化程序相关的统计数据一样,这些值是从表中收集统计数据时的不同精度的估计值.因此,完全可以预期它们会接近但不完全准确,完全有可能它们会非常不正确.收集统计信息时,指定应采样的行(或块)的百分比.可以指定100%的样本大小,在这种情况下,Oracle会检查每一行,但是要求样本大小接近那么大是相对罕见的.要求更小的样本量(明确地或通过让Oracle自动确定样本大小)要高效得多.如果您的行样本不包含值为1000的一行,则HIGH_VALUE将不为1000,HIGH_VALUE将为5,假设该值是样本看到的最大值.
统计数据也是一个快照.默认情况下,11g将每晚收集自上次在该对象上收集统计信息以来经历了足够更改的对象的统计信息,以保证刷新统计信息,尽管您可以禁用该作业或更改参数.因此,如果您今天收集100%样本大小的统计信息以获得1000的HIGH_VALUE,然后插入值为3000的一行并且永远不再修改该表,那么Oracle可能永远不会再收集该表的统计信息(除非你明确要求它,并且HIGH_VALUE将永远保持1000.
假设列上没有直方图(这是另一个完整的讨论),Oracle使用LOW_VALUE和HIGH_VALUE来估计特定谓词的选择性.如果LOW_VALUE为1,HIGH_VALUE为1000,表中有1,000,000行,列上没有直方图,并且您运行查询,如
SELECT * FROM some_table WHERE column_name BETWEEN 100 and 101
Oracle将猜测数据均匀分布在1到1000之间,以便此查询将返回1,000行(将表中的行数(1百万)乘以查询覆盖的范围的一小部分(1/1000)).反过来,这种选择性估计将推动优化器确定使用索引或执行表扫描是否更有效,使用哪种连接方法,评估各种谓词的顺序等等.如果您有然而,数据的非均匀分布可能最终会在列上显示直方图,从而为Oracle提供有关列中数据分布的详细信息,而不是LOW_VALUE和HIGH_VALUE提供的信息.