为什么当我在WHERE子句中指定ROWNUM时,SQL查询比指定日期范围时慢
我正在尝试实现大型数据集的分页。我想这可能有用为什么当我在WHERE子句中指定ROWNUM时,SQL查询比指定日期范围时慢,sql,oracle,oracle11g,query-performance,Sql,Oracle,Oracle11g,Query Performance,我正在尝试实现大型数据集的分页。我想这可能有用 选择asortyment.nazwa作为nazwa, parpoz.ilosc作为ilosc, 帕波兹·塞纳布托作为塞纳, parnagl.data作为数据 来自帕尔纳格尔 ParPoz.ParNaglID=ParNagl.ParNaglID上的内部联接ParPoz 在asortyment.poztowid=parpoz.poztowid上内部连接asortyment asortyment.grupaptid=grupapt.grupaptid上的
选择asortyment.nazwa作为nazwa,
parpoz.ilosc作为ilosc,
帕波兹·塞纳布托作为塞纳,
parnagl.data作为数据
来自帕尔纳格尔
ParPoz.ParNaglID=ParNagl.ParNaglID上的内部联接ParPoz
在asortyment.poztowid=parpoz.poztowid上内部连接asortyment
asortyment.grupaptid=grupapt.grupaptid上的内部联接gruppt
其中ROWNUM信息太少,无法回答问题。如果没有模式,很难猜测QO可能在做什么。如果没有模式,如果我们有执行计划,我们仍然可以取得进展。但执行计划也没有给出
我们必须记住,在没有限制WHERE
子句的情况下,正确执行查询要求数据库可能需要尽可能地生成所有可用行。然后,它将只产生前10个。。。不管是什么,因为没有订单
但是使用限制性的WHERE
子句,查询计划可能不要求这样一个完全开放的执行计划是正确的。事实上,它可以首先限制自己查找与日期范围匹配的行。根据索引结构,首先过滤日期可能会快得多
如果20亿行满足无限制的JOIN
而没有指定日期,该怎么办
如果只有两行与指定的日期范围匹配,而这两行中只有一行符合JOIN
标准,该怎么办
您认为这两个查询中哪一个执行得更快
因此,我猜下一条信息缺失是显而易见的:您希望查询做什么?在没有排序的情况下使用ROWNUM
限制是非常奇怪的,但也许你有一个有趣的例子,它很有用。OTOH,如果使用日期范围更快。。。为什么不使用日期范围?您可以发布查询的解释计划吗?您可以同时使用这两种计划吗?查看解释计划…我希望rownum在所有数据累积后完成…而日期筛选器正在减少数据prejoin@Mech我觉得做日期范围是次优的,它会产生不一致的块大小。。。我宁愿在这里有某种形式的正确分页。如果你也在进行排序,那么使用rownum不是很有意义吗?我只是想实现分页,似乎日期范围就是一种方式。。。