我创建了一个表create customer
(
cust_num varchar(20) not null,
name varchar(100),
primary key(cust_num)
)
同时在该表插入了1000多万条记录
情况一、
--满足这个条件的记录刚好21条,查询大概用了8秒
select * from customer where name>='N000000000015180' and name<='N000000000015200'
该sql的执行计划如下:
Optimizer Plan:
Rows
Operator
(ID)
Cost
0.995026
RETURN
( 1)
53751.5
|
0.995026
TBSCAN
( 2)
53751.5
|
1.03919e+007
Table:
DB2ADMIN
CUSTOMER
--查询条件跟上面的sql一样,只是此时只返回前面的20条记录,此时查询速度就非常的快,大概用0.4秒
select * from customer where name>='N000000000015180' and name<='N000000000015200' fetch first 20 row only
该语句的执行计划如下:
Optimizer Plan:
Rows
Operator
(ID)
Cost
0.995026
RETURN
( 1)
53751.5
|
0.995026
TBSCAN
( 2)
53751.5
|
1.03919e+007
Table:
DB2ADMIN
CUSTOMER
问题:从执行计划上看,两个sql语句的都一样,可是为什么加了fetch first n rows only之后却能提高了性能?什么原因造成,怎样的一个原理?还有,关于执行计划图本人不是很会看,望高手多多指教怎么去分析这个执行计划图
情况二、上面已经说过了select * from customer where name>='N000000000015180' and name<='N000000000015200' 这里满足条件的刚好21条记录,我这次依然使用fetch first n rows only,但是这次我把n改成比30,也就是比实际满足条件的记录数大时,
如下:
select * from customer where name>='N000000000015180' and name<='N000000000015200' fetch first 30 row only,这个语句也大概花了8秒,也就是说此时跟没使用fetch first n rows only的效果是一样。
执行计划如下:
Optimizer Plan:
Rows
Operator
(ID)
Cost
0.995026
RETURN
( 1)
53751.5
|
0.995026
TBSCAN
( 2)
53751.5
|
1.03919e+007
Table:
DB2ADMIN
CUSTOMER
问题:
这个时候为什么使用fetch first n rows only却没有起到提高性能的作用?难道,不是在满足条件的记录中寻找前面30条记录返回(此时应该返回21条吧)
这还不好理解吗?给你1000W让你循环找某条件的记录正好前20条在10000条记录以内,然后0.4S返回了,但你找30条他当然要全部找完了时间当然长了
很好,谢谢你的提醒