技术开发 频道

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

  该语句的执行过程,如果用语言描述可以描述成这样:

  1)如果是第一次执行该步骤,则取得表的第一条记录;否则取得当前记录的下一条记录。如果记录已经扫描结束,则执行步骤4,否则执行步骤2。

  2)判断该记录是否满足过滤条件c1=2,满足则执行步骤3,否则执行步骤1。

  3)把该记录放到结果集中,执行步骤1。

  4)将结果集返回给客户端。

  实际上,数据库执行查询语句的过程也是类似的,下面是该查询语句的执行计划:

  #RSET:[21, 1, 1];
  #XFLT:
[0, 0, 0]; EXPR0 = 2
  #CSEK:
[21, 1, 1]; INDEX33555545(T1), FULL_SCAN

  该执行计划中出现的内容,在此做出解释:

  1)CSEK(查找)类似于上文中描述的步骤1,方括号中的内容是执行该操作的评估代价,本文不作分析。“INDEX33555545(T1)”说明使用了T1表的聚集索引,“FULL_SCAN”表示对聚集索引INDEX33555545(T1)进行全扫描。

  这里需要注意的是,达梦数据库中的表默认情况下是索引组织的。如果建表时指定了cluster primary key,那么数据以该clsuter primary key组织数据,否则以rowid组织数据。

  2)XFLT(过滤)类似于上文中描述的步骤2,“EXPR0 = 2”是过滤条件。

  3)RSET(结果集)类似于上文中描述的步骤3,用来存放符合条件的记录集。

  我们可以看出,数据库的执行过程和我们用语言描述的步骤是一致的。

  该查询语句完整的执行流程如下:

  1)CSEK取得第一条记录(1,1)传给XFLT,将控制权传给XFLT。

  2)XFLT发现该记录(1,1)不符合条件,将控制权传给CSEK。

  3)CSEK取得下一条记录(2,2)传给XFLT,将控制权传给XFLT。

  4)XFLT发现记录(2,2)符合条件,将该记录传给RSET,将控制权传给RSET。

  5)RSET将记录(2,2)放入结果集,将控制权传给XFLT。

  6)XFLT给控制权传给CSEK。

  7)CSEK取得下一条(3,3)传给XFLT,将控制权传给XFLT。

  8)XFLT发现该记录(3,3)不符合条件,将控制权传给CSEK。

  9)CSEK取得下一条(4,4)传给XFLT,将控制权传给XFLT。

  10)XFLT发现该记录(4,4)不符合条件,将控制权传给CSEK。

  11)CSEK取得下一条(5,5)传给XFLT,将控制权传给XFLT。

  12)XFLT发现该记录(5,5)不符合条件,将控制权传给CSEK。

  13)CSEK取得下一条(6,6)传给XFLT,将控制权传给XFLT。

  14)XFLT发现该记录(6,6)不符合条件,将控制权传给CSEK。

  15)CSEK发现描述操作已经结束,通知XFLT结束。将控制权传给XFLT。

  16)XFLT得知查询操作结束,通知RSET结束。将控制权传给RSET。

  17)RSET得知操作结束。

  18)发送结果集(包含记录(2,2))给客户端。

0
相关文章