首页 新闻 会员 周边

关于DB2 fetch first n rows only 性能问题,跪求高手

0
悬赏园豆:10 [已解决问题] 解决于 2013-09-15 14:25

我创建了一个表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条吧)

DB2
蚂蚁攻城师的主页 蚂蚁攻城师 | 初学一级 | 园豆:171
提问于:2013-05-03 22:40
< >
分享
最佳答案
0

这还不好理解吗?给你1000W让你循环找某条件的记录正好前20条在10000条记录以内,然后0.4S返回了,但你找30条他当然要全部找完了时间当然长了

收获园豆:10
56180825 | 小虾三级 |园豆:1756 | 2013-05-04 22:30

很好,谢谢你的提醒

蚂蚁攻城师 | 园豆:171 (初学一级) | 2013-09-15 14:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册