如何解决为什么在指定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,如果使用日期范围更快...为什么不使用日期范围?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。