优化器如何使用分布统计信息

优化器将使用分布统计信息,以便更好地估算不同查询存取方案的成本。

除非优化器有关于值在低值与高值之间的分布情况的附加信息,否则将假定数据值均匀分布。 如果数据值彼此差异较大、在范围的某些部分集群或者包含许多重复值,那么优化器将选择次于最优的存取方案。

请考虑以下示例:为了选择成本较低的存取方案,优化器需要估算某个列值满足等式或范围谓词的行数。 估算越准确,优化器选择最优存取方案的可能性就越大。 对于下列查询:
   select c1, c2
     from table1
     where c1 = 'NEW YORK'
     and c2 <= 10
假定对列 C1 和 C2 都定义了索引。 一种可能的存取方案是,使用基于 C1 的索引来检索所有符合条件 C1 = 'NEW YORK' 的行,然后对检索到的每一行检查是否符合条件 C2 <= 10。 备用计划是使用 C2 上的索引通过 C2 <= 10检索所有行,然后检查是否 C1 = 'NEW YORK' 对应每个检索到的行。 因为执行查询的主要成本通常是检索行的成本,所以检索次数最少的方案最好。 选择此方案意味着需要估算满足每个谓词的行数。
如果没有分布统计信息,但已对表或统计视图运行 RUNSTATS 实用程序,那么可供优化器使用的信息只有列中的次高数据值(HIGH2KEY)、次低数据值(LOW2KEY)、相异值数目(COLCARD)和行数(CARD)。 假定列中的数据值具有相等的频率,并且各个数据值在 LOW2KEY 与 HIGH2KEY 之间均匀分布,以此为前提估算满足等式或范围谓词的行数。 具体而言,满足等式谓词 (C1 = KEY) 的行数估算为 CARD/COLCARD,而满足范围谓词 (C1 BETWEEN KEY1 AND KEY2) 的行数可通过以下公式估算:
       KEY2 - KEY1
    ------------------  x CARD
    HIGH2KEY - LOW2KEY

仅当数据值在列中的真实分布相当均匀时,这些估算才准确。 如果没有分布统计信息,并且数据值的频率变动很大,或者数据值的分布非常不均匀,那么估算可能偏差很大,并且优化器选择的存取方案可能并非最优。

存在可用的分布统计信息时,可通过以下方法大大减少此类误差的可能性:使用高频值统计信息来估算满足等式谓词的行数,使用高频值统计信息和分位数统计信息来估算满足范围谓词的行数。