引言
考虑下面的情况:
一张表T,有列C1,C2,C3,C4,C5。其中C1上有索引C1X,C2上有索引C2X,C3,C4,C5上有索引C345X。表中有100000000行数据。
查询语句:
Select * From T Where C1=20 And C2=5 And C3=11;
前面介绍过,对于一张表,只能使用它的一个索引进行索引扫描,上面查询的三个谓词都是可索引谓词,假设这三个谓词的过滤因子都是1/100,优化器选择使用C1X索引。那么就需要读入100000000*1/100=1000000行数据。I/O开销无疑是可观的。
对于这样的访问方案,我们认为它太浪费索引了!三个索引,只用一个,导致另外两个谓词连筛选谓词都算不上(筛选谓词起码能对索引项进行筛选呢)。
如果能够同时使用三个索引,那么三个谓词合起来的过滤因子就是1/100*1/100*1/100=1/1000000,最终需要读入的数据行为100000000*1/1000000=100行,效率根本不能相提并论!
但是,这样的访问方式存在吗?在DB2中,是存在的。这就是所谓的多索引访问。