这更像是一个学术问题,因为我对DB2查询优化器的细节很感兴趣。
我有一个包含10000条记录且没有索引的表。 SYSCAT.TABLES中的COLCARD显示10000,名为MesFabricacao的列具有以下COLSTAT:
COLCARD HIGH2KEY LOW2KEY TABNAME COLUMN
198 198 2 CARINFO MESFABRICACAO
根据核心手册“DB2PerfTuneTroubleshoot-db2d3e1011.pdf”
第451页,没有直方图的谓词之间的基数公式为:(( KEY2 - KEY1) / (HIGH2KEY - LOW2KEY)) * CARD
对于给定的查询"SELECT COUNT(*) FROM STATS.CARINFO WHERE MesFabricacao BETWEEN 1 AND 3"
,使用db2exfmt
我看到过滤因子为0.0151258,这个值无法解释QO用于估算的原因。
有没有人解释为什么DB2应用此过滤因子?我正在使用DB2 10.1.0.0。
(db2exfmt的输出)
2) Sargable Predicate,
Comparison Operator: Less Than or Equal (<=)
Subquery Input Required: No
Filter Factor: 0.0151258
Predicate Text:
--------------
(Q1.MESFABRICACAO <= 3)
3) Sargable Predicate,
Comparison Operator: Less Than or Equal (<=)
Subquery Input Required: No
Filter Factor: 1
Predicate Text:
--------------
(1 <= Q1.MESFABRICACAO)
Input Streams:
-------------
1) From Object STATS.CARINFO
Estimated number of rows: 10000
Number of columns: 2
Subquery predicate ID: Not Applicable
Column Names:
------------
+Q1.$RID$+Q1.MESFABRICACAO
Output Streams:
--------------
2) To Operator #2
Estimated number of rows: 151.258
Number of columns: 0