create table t1(c1 int,c2 int);
insert into t1 values(1,1);
insert into t1 values(2,2);
insert into t1 values(3,3);
insert into t1 values(4,4);
insert into t1 values(5,5);
insert into t1 values(6,6);
查询语句为:
select * from t1 where c1=2;
该语句的执行过程,如果用语言描述可以描述成这样:
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。