8.如果列上存在索引,如何理解中的group by操作?
查询语句“select c1,count(*) from t1 where c1>=2 group by c1;”对应的执行计划为:
#RSET:[11, 1, 1];
#XEVL:[0, 0, 0];
#SAGR:[0, 0, 0]; group_by_num(1), function_num(1)
#CSEK:[11, 1, 1]; UIT1C1(T1), INDEX_GE_SEARCH
#XEVL:[0, 0, 0];
#SAGR:[0, 0, 0]; group_by_num(1), function_num(1)
#CSEK:[11, 1, 1]; UIT1C1(T1), INDEX_GE_SEARCH
我们可以得到,CSEK使用了索引UIT1C1进行了范围查找。首先传递给SARG的是连续的c1=2的记录组,然后是c1=3的记录组,然后是c1=4的记录组,……
此处SARG的执行流程是
1)从CSEK取得一条c1=2记录,将计数加1。
2)从CSEK取得下一条记录,如果该记录满足c1,将计数+1。
3)重复执行步骤2,直到取得第一条不满足c1=2的记录,将(2,对应的计算)传递给XEVL,再传给RSET(结果集)。接着对c1=3的记录组执行同样的流程。
依此类推,直到处理完所有符合条件的记录。
这里我们的分组函数是count(*),如果是其它的分组函数,处理过程类似。
9.如果列上不存在索引,如何理解中的group by操作?
查询语句“select c2,count(*) from t1 where c2>=2 group by c2;”对应的执行计划为:
#RSET:[21, 1, 1];
#XEVL:[0, 0, 0];
#HAGR:[0, 0, 0]; group_by_num(1), function_num(1)
#XFLT:[0, 0, 0]; EXPR0 >= 2
#CSEK:[21, 1, 1]; INDEX33555550(T1), FULL_SCAN
#XEVL:[0, 0, 0];
#HAGR:[0, 0, 0]; group_by_num(1), function_num(1)
#XFLT:[0, 0, 0]; EXPR0 >= 2
#CSEK:[21, 1, 1]; INDEX33555550(T1), FULL_SCAN
这里因为c2上没有索引,HARG的作用是HASH分组。
HARG的执行流程是:
1)从XFLT取得一条记录
2)记录的c1=m,如果在hash表中已经对应项,计数+1,如果不存在对应项,在创建一个新的hash项。
3)所有的符合过滤条件的记录处理完成之后,HARG才会将控制权限传给上层操作符,HARG每次向上层操作符传递一条(m,m对应的计数)。
这里我们的分组函数是count(*),如果是其它的分组函数,处理过程类似。