技术开发 频道

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

  3.如果表t1上的c1列有唯一索引,如何执行呢?

  首先删除c1列上的非唯一索引,然后在c1列上创建唯一索引:

  drop index it1c1;
  
create unique index uit1c1 on t1(c1);

  查询语句“select * from t1 where c1=2;”对应的执行计划为:

  #RSET:[201, 2, 1];
  #CSEK(SECOND):
[201, 2, 1]; UIT1C1(T1), INDEX_EQU_SEARCH

  该执行计划的执行流程为:

  1)CSEK使用c1=2查找非聚集索引,得到c1=2的索引记录(2,rowid1)中的rowid1(为数值)。使用rowid1查找聚集索引得到对应的数据记录(2,2)传递给RSET,将控制权传给RSET。(当然,有人也许会问,如果没有记录满足c1=2怎么办呢?那么,此处什么记录都不传递给RSET,通知RSET查询操作结束,最后返回空集给客户端)。

  2)RSET将记录(2,2)放入结果集,操作结束(因为是唯一索引,所以最多只有1条记录满足c1=2)。

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

  这里我们发现,例3使用了唯一索引,例2使用了非唯一索引。例3的执行速度大于例2的执行速度。

  4.如何理解执行计划中的top n操作?

  查询语句“select top 10 * from t1 where c1>2;”对应的执行计划为:

  #RSET:[21, 1, 1];
  #XTOP:
[0, 0, 0]; top_off(0), top_num(10)
  #XFLT:
[0, 0, 0]; EXPR1 > 2
  #CSEK:
[21, 1, 1]; INDEX33555545(T1), FULL_SCAN

  XTOP(取得前N条记录):将XFLT操作符传递来的记录放入到RSET(结果集)中,并判断记录数是否已经等于给定值10(语句中的top 10)。如果已经等于10,则查询已经执行成功,退出。否则将控制权限传给XFLT,继续执行。依次执行,直到取得10条记录,或者表CSEK操作已经查询结束(即符合条件的记录不满10条)。

0
相关文章