上图执行的sql为例,该查询生成的执行树大致为:filter -> {matched row position} -> projection -> aggregation -> order –> results
1、首先以a<=’20100101’为条件进行过滤,在以智能索引信息进行过滤时,存在以下三种可能:
• 完全确定,如上图中智能索引信息栏所示,在利用a<=’20100101’条件进行过滤时,由于a列第一个数据包的智能索引统计信息中的最大值和最小值均为’20100101’,表明该数据包中的记录完全符合条件,即为该数据包内数据全部命中。
•有可能:在第二个数据包中,由于最小值为‘20100101’,最大值为‘20100102’,显然该数据包中存在的‘20100102’取值不满足a<=’20100101’条件,因此该包中的记录为部分满足,即为该数据包内数据部分命中。
•完全排除:在第三和第四个数据包中,由于两个数据包中的最小值分别为‘20100102’和‘20100105’,显然两个数据包中的数据均不能满足a<=’20100101’条件,因此这两个包可被完全排除。
2、在进行聚合运算时,第一个数据包完全命中,可以从B字段对应数据包中取得sum信息,由于第二个包属于部分命中,因此需要读取该包信息并进行分组聚合运算。
所以针对该示例,实际仅需读取第二个字段中一个包。
通过该示例能看到,通过智能索引,可以通过极小的代价对数据进行过滤,并可最大程度的利用其中智能索引信息用于统计计算。