我使用的是ms sql server。我有一个像这样的sql:
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?)。
另外,我更改了另一个数据库,问题没有发生。
发布于 2018-03-29 17:16:21
答案可能与ORDER BY子句中使用的底层排序算法有关。在获取前10、20等行之前,首先需要对记录进行排序。为了便于说明,我们假设在ORDER BY中出现的列上没有索引,并且数据库正在使用分而治之的排序算法,比如合并排序。对于仅获取单行的极端情况,需要运行整个排序算法。这是因为在对整个记录集进行排序之前,我们不知道单个记录是什么。但是,在获取50条记录的情况下,不需要对整个数据集进行排序。相反,一旦我们达到50条记录的块,我们就可以停止这种排序,然后可能只需要对剩下的50条记录进行进一步排序。
在实践中,如果ORDER BY子句中的列被编入索引,那么上述描述可能会发生变化。在这种情况下,我们可能只需要遍历一次B树来找到匹配的记录。如果是这样,那么在获取少量记录和获取大量记录时,性能可能没有太大差异。
发布于 2018-03-29 17:15:50
执行时间的差异可能来自查询优化器。它只能选择不同的查询计划,例如,在10行的情况下切换到嵌套循环连接,但在100行的情况下使用merge。
只需比较各种变体的查询执行计划,看看发生了什么变化。
如果是关于使用的连接类型,您可以查看更新底层表的统计信息是否有助于获得稳定的性能
https://stackoverflow.com/questions/49552033
复制相似问题