技术开发 频道

数据库性能调优技术之单表执行计划

  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

  我们可以得到,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

  这里因为c2上没有索引,HARG的作用是HASH分组。

  HARG的执行流程是:

  1)从XFLT取得一条记录

  2)记录的c1=m,如果在hash表中已经对应项,计数+1,如果不存在对应项,在创建一个新的hash项。

  3)所有的符合过滤条件的记录处理完成之后,HARG才会将控制权限传给上层操作符,HARG每次向上层操作符传递一条(m,m对应的计数)。

  这里我们的分组函数是count(*),如果是其它的分组函数,处理过程类似。

0
相关文章