在DB2优化器中使用分布统计信息
2009-12-23 15:00:17 来源:WEB开发网频率统计信息
假设表 CARS 现在有大约 1,000,000 条记录,不同的型号在表中出现的频率如下所示:
表 1. 表 CARS 中 TYPE 列的频率统计信息
TYPE | COUNT(TYPE) |
A | 506135 |
B | 301985 |
C | 104105 |
D | 52492 |
E | 19584 |
F | 10123 |
G | 4876 |
H | 4589 |
I | 4403 |
J | 3727 |
型号为 A 的汽车最受购买者的青睐,因此生产的汽车中大约有 50% 是这种型号。型号 B 和型号 C 仅次于型号 A ,分别占所有汽车的 30% 和 10%。其他所有型号加在一起仅占 10%。
上面的表显示了 “TYPE” 列的频率统计信息。通过基本统计信息,DB2 优化器只能了解到该表包含 1,000,000 行(表的基数)和 10 种不同的值(型号),即 A 到 J。如果没有分布统计信息,优化器会认为每种值以相同的频率出现,大约都是出现 100,000 次。而一旦生成了关于 “TYPE” 列的分布统计信息,优化器即可了解每种型号真正的出现频率。因此,优化器清楚各种已有型号出现的不同频率。
优化器使用频率统计信息来计算用于检查相等或不等的谓词的过滤因子。例如:
SELECT * FROM CARS WHERE TYPE = 'H'
分位数统计信息
与频率统计信息不同,分位数统计信息与不同值的出现频率无关,而与一个表中有多少行小于或大于某个值(或者有多少行介于两个值之间)相关。分位数统计信息提供关于一个列中的值是否聚合的信息。为获得这样的信息,DB2 假定列中的值是按升序排列的,并根据正则行间隔确定相应的值。
我们来看看表 CARS 中的 “STATE” 列,该列按升序排列。根据正则行间隔,即可确定 “STATE” 的对应值。
表 2. CARS 表中 STATE 列的分位数统计信息
COUNT(row) | STATE ASC |
5479 | 1 |
54948 | 10 |
109990 | 21 |
159885 | 31 |
215050 | 42 |
265251 | 52 |
320167 | 63 |
370057 | 73 |
424872 | 84 |
475087 | 94 |
504298 | 100 |
... | 100 |
1012019 | 100 |
由于已完工的汽车仍然没有从表中删除,因此状态为 100 (=完工)的汽车数量比所有处于其他状态的汽车总和还多。已完工的汽车占表中所有记录的 50%。
注意: 在实际情况下,已完工的汽车数量甚至还要更多(例如超过 99%)。在后文中的具体例子中可看到这种情况。
上表显示了 “STATE” 列的分位数统计信息。有了这种关于有多少行分别小于和大于确定值的信息,优化器即可计算出用于测试小于(小于等于)、大于(大于等于)或介于两值之间的谓词的过滤因子。例如:
SELECT * FROM CARS WHERE STATE < 100
SELECT * FROM CARS WHERE STATE BETWEEN 50 AND 70
根据已有的分位数统计信息计算出来的过滤因子不是很精确,但即使只收集 20 个值,其误差仍然低于 5%。
更多精彩
赞助商链接