performance - USER_TAB_COLUMNS 中的 LOW_VALUE 和 HIGH_VALUE

标签 performance oracle indexing query-optimization oracle11g

我有一个关于 View USER_TAB_COLUMNS(或等效项)中的 LOW_VALUE 和 HIGH_VALUE 列的问题。

我只是想知道这些值是否总是正确的,例如,如果您有一列 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% 的样本量收集统计数据以获得 HIGH_VALUE 1000 然后插入一个值为 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 行(将表中的行数(100 万)乘以查询覆盖范围的分数(1/1000))。反过来,这种选择性估计将插入优化器确定使用索引或进行表扫描是否更有效、使用何种连接方法、评估各种谓词的顺序等。如果您有数据的非均匀分布,但是,您可能最终会得到列上的直方图,与 LOW_VALUE 相比,它为 Oracle 提供了关于列中数据分布的更多详细信息。和 HIGH_VALUE提供。

关于performance - USER_TAB_COLUMNS 中的 LOW_VALUE 和 HIGH_VALUE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8719819/

相关文章:

SQL - 使用正则表达式更新列中的字符串

mysql - 按列排序应该有索引吗?

indexing - elasticsearch-是否可以动态设置index.ttl.interval

c# - 链式 LINQ 语句的效率如何?

java - 使用 Java 批量上传到 Box*

java - Array 与 ArrayList 的性能

oracle - 跨用户引用外键

sql - 使用递归子查询分解的循环检测

ios - 如何在没有混合图层的情况下获得具有渐变的图像?

arrays - Julia 从元组中为数组中的每一行选择元素