技术开发 频道

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

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

  表t1的定义以及数据和1中描述的一样。

  创建索引:

  create index it1c1 on t1(c1);

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

  #RSET:[201, 2, 1];

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

  CSEK行的“SECOND”表示使用非聚集索引“IT1C1”,对该索引进行索引等值(INDEX_EQU_SEARCH)查找。

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

  1)CSEK使用c1=2查找非聚集索引,得到第一条c1=2的索引记录(2,rowid1)中的rowid1(为数值)。使用rowid1查找聚集索引得到对应的数据记录(2,2)传递给RSET,将控制权传给RSET。

  2)RSET将记录(2,2)放入结果集,将控制权传给CSEK。(因为c1上的索引是非唯一的,所以可能出现两条以上的记录满足c1=2,所以需要将控制权传给CSEK)。

  3)CSEK取得当前非聚集记录的下一条记录(3,rowid2),因为3!=2,所以扫描结束。将控制权传给RSET。(如果满足c1=2的记录数大于1条,需要继续传递记录给RSET,以此类推,直到遇到不满足c1=2的那条记录,结束操作。)

  4)RSET得知操作结束。

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

0
相关文章