USER_TAB_COLUMNS中的LOW_VALUE和HIGH_VALUE

时间:2012-01-03 22:55:11

标签: performance oracle indexing query-optimization oracle11g

我对视图USER_TAB_COLUMNS(或等效)中的列LOW_VALUE和HIGH_VALUE有疑问。

我只是想知道这些值是否总是正确的,如果你有一个500k行值为1的列,500k行值为5和1行值1000,LOW_VALUE应为1(转换原始图形后)和HIGH_VALUE应为1000(转换原始图形后)。但是,在任何情况下,甲骨文都会“错过”这个异常值,而对于HIGH_VALUE则为5吗?

另外,这两个值的目的是什么?

由于

1 个答案:

答案 0 :(得分:6)

与所有与优化程序相关的统计数据一样,这些值是在表格上收集统计数据时具有不同程度准确度的估计值。因此,完全可以预期它们会接近但不完全准确,完全有可能它们会非常不正确。

收集统计信息时,指定应采样的行(或块)的百分比。可以指定100%的样本大小,在这种情况下,Oracle会检查每一行,但是要求样本大小接近那么大是相对罕见的。要求更小的样本量(明确地或通过让Oracle自动确定样本大小)要高效得多。如果您的行样本不包含值为1000的一行,HIGH_VALUE将不是1000,HIGH_VALUE将为5,假设这是样本看到的最大值。 / p>

统计数据也是一个快照。默认情况下,11g将每晚收集自上次在该对象上收集统计信息以来经历了足够更改的对象的统计信息,以保证刷新统计信息,但您可以禁用该作业或更改参数。因此,如果您今天收集100%样本大小的统计信息以获得1000的HIGH_VALUE然后插入值为3000的一行并且永远不再修改该表,则Oracle可能永远不会收集统计信息那个表再次(除非你明确要求它)并且HIGH_VALUE永远保持1000。

假设列上没有直方图(这是另一个完整的讨论),Oracle使用LOW_VALUEHIGH_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_VALUEHIGH_VALUE提供的信息。