为什么在指定ROWNUM时比在WHERE子句中指定日期范围时SQL查询的速度慢

问题描述

我正在尝试实现大型数据集的分页。我认为这可能有效

select asortyment.nazwa as NAZWA,parpoz.ilosc as ILOSC,parpoz.cenabrutto as CENA,parnagl.data as DATA
from parnagl

inner join ParPoz on ParPoz.ParNaglID=ParNagl.ParNaglID 
inner join asortyment on asortyment.poztowid=parpoz.poztowid 
inner join grupapt on asortyment.grupaptid=grupapt.grupaptid
WHERE ROWNUM <= 10

这需要12秒才能执行。 另一方面,如果我使用WHERE子句指定日期范围,则只需50毫秒...有什么方法可以优化此范围?

数据库是Oracle 11g。

解决方法

信息不足,无法回答问题。没有模式,很难猜测QO会做什么。没有模式,如果有执行计划,我们仍可能会取得进展。但是也没有给出执行计划。

我们必须记住,在没有限制WHERE子句的情况下,查询的正确执行要求数据库可能需要详尽地尝试产生所有可用的行。然后,它将只生成前10个……可能会是任何东西,因为没有排序。

但是在限制WHERE子句的情况下,查询计划可能并不要求这样的开放式执行计划是正确的。实际上,它可以首先将自身限制为首先查找与日期范围匹配的行。根据索引结构,首先过滤日期可能会更快。

如果20亿行满足无限制的JOIN而没有指定日期怎么办?

如果只有2行仅与指定的日期范围匹配,然后这两个条件之一仅符合JOIN条件怎么办?

您认为这两个查询中的哪个查询执行得更快?

因此,我想下一个丢失的信息很明显:您希望查询做什么?在没有排序的情况下使用ROWNUM限制是很奇怪的,但是也许您有一个有趣的例子,它很有用。 OTOH,如果使用日期范围更快...为什么不使用日期范围?