(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))给客户端。
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))给客户端。
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 |
最新相关文章
发表评论