首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fetch next 20 rows比fetch next 50 rows慢

fetch next 20 rows比fetch next 50 rows慢
EN

Stack Overflow用户
提问于 2018-03-29 17:07:44
回答 2查看 946关注 0票数 1

我使用的是ms sql server。我有一个像这样的sql:

代码语言:javascript
复制
select ... from 
    (select ... from ... left join .... where ... order by ... offset 0 rows fetch next 50 rows only) a
    left join ...
    left join ...

当我将50更改为20或10时,执行速度很慢,当我使用50或100时,执行速度不会那么慢,这可能会导致什么结果?

我比较了sqlplan,两个图没有区别,除了每个节点中的参数(step?)。

另外,我更改了另一个数据库,问题没有发生。

EN

回答 2

Stack Overflow用户

发布于 2018-03-29 17:16:21

答案可能与ORDER BY子句中使用的底层排序算法有关。在获取前10、20等行之前,首先需要对记录进行排序。为了便于说明,我们假设在ORDER BY中出现的列上没有索引,并且数据库正在使用分而治之的排序算法,比如合并排序。对于仅获取单行的极端情况,需要运行整个排序算法。这是因为在对整个记录集进行排序之前,我们不知道单个记录是什么。但是,在获取50条记录的情况下,不需要对整个数据集进行排序。相反,一旦我们达到50条记录的块,我们就可以停止这种排序,然后可能只需要对剩下的50条记录进行进一步排序。

在实践中,如果ORDER BY子句中的列被编入索引,那么上述描述可能会发生变化。在这种情况下,我们可能只需要遍历一次B树来找到匹配的记录。如果是这样,那么在获取少量记录和获取大量记录时,性能可能没有太大差异。

票数 1
EN

Stack Overflow用户

发布于 2018-03-29 17:15:50

执行时间的差异可能来自查询优化器。它只能选择不同的查询计划,例如,在10行的情况下切换到嵌套循环连接,但在100行的情况下使用merge。

只需比较各种变体的查询执行计划,看看发生了什么变化。

如果是关于使用的连接类型,您可以查看更新底层表的统计信息是否有助于获得稳定的性能

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49552033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档