【问题标题】:Pagination in Oracle with dynamic queryOracle中的分页与动态查询
【发布时间】:2019-11-23 14:44:49
【问题描述】:

我有一个返回大量数据的查询。当用户在更大的日期范围内搜索数据时,它可能会出现多达 500 万条记录,并且当这种情况发生时,应用程序会冻结一定的时间。

所以我决定对查询结果进行分页,但我试图在不更改任何数据库的情况下这样做。让我解释一下:

我有一个使用动态 SQL 检索所有数据的存储过程。输入参数为3:

  • 选择案例数的 Varchar(用于选择应执行的选择),
  • 和 2 个其他 Varchar 参数,用于选择查询的字段和条件,换句话说 - FROM 之前的一个和 WHERE 子句之后的一个。 这两个参数在这个问题中很重要。

例如,我调用查询的过程如下所示:

first_parameter || ' FROM (...这是我的查询,其中所有可能的字段都通过连接、数据库链接等选择...) WHERE ' || second_parameter

所以,我可以修改查询的开始和结束,现在我想修改它以启用分页,假设一次最多 1.000 条记录。

我尝试在 C# 中通过在 first_parameter 中添加 rownum 以及选定的字段来修改它

选择rownum、field1、field2等...)

,并使用

rownum 在 WHERE 子句中

。这实际上可行,但是对于分页,我还需要告诉开始和结束的行,例如

WHERE rownum > 1000 AND rownum

,但这不起作用。

我如何在 Oracle 11g 中执行此操作,其中 OFFSET 不可用,有人可以告诉我吗?如果可能的话,我更喜欢不更改参数内部查询的解决方案,因为我可以将我想要的所有内容从代码中的 C# 发送到有问题的两个参数中(当然是 Varchar 值)。

附: : 我从来没有做过分页,如果我写了一些愚蠢的东西,请原谅我;)

【问题讨论】:

    标签: oracle dynamic-sql


    【解决方案1】:

    一种选择是计算每一行的行数,例如

    with ycq as
      -- your current query goes here
      (select col1, 
              col2, ..., 
           row_number() over (order by col1) rn         --> this is new ...
       from ...
       where ...
      )
    select y.col1, 
           y.col2,
           ...
    from ycq y
    where y.rn between :lower_value and :upper_value    --> ... and is used here
    order by y.some_col
    

    【讨论】:

    • 谢谢你,它有效。但是,查询执行现在变得更慢了。我会尝试不按顺序,我想这是问题所在。
    • 我用一个简单的 rownum 更改了您的 row_number() ,没有任何顺序,现在查询执行速度很快。但这是正确的,当我指定不同的下/上参数值无顺序时,Oracle是否总是返回不同的行?
    • 没有保证;它可能会,但它可能不会以相同的顺序返回行。唯一确定的方法是使用 ORDER BY 子句。
    • 是的,这就是我所害怕的。但是这种方式查询执行非常慢,1 秒对 58 与 order by。虽然我对 500 万条记录使用了日期范围,但我必须测试更多通常的日期范围。
    • 也许你应该考虑一下。谁愿意滚动浏览 500 万行,即使是在包含 1000 行的页面上? 5000 页?就这么多了。也许,如果你应用额外的条件,返回的行数会少得多,分页会有意义(我建议的查询会更快)。
    【解决方案2】:

    对于真正的分页,您应该查看Oracle REST Data Services (ORDS) - 它是免费的,易于设置,并且内置了分页。

    【讨论】:

    • 等我有时间再仔细看看,看起来很复杂。虽然这到底是什么,只是某种数据库插件或网络特定功能?我只需要桌面应用程序的解决方案。
    • 它不是数据库的一部分,它是一个单独的产品,但免费。它使在 Oracle 数据库前设置 Web 服务变得容易。长话短说,它将查询转换为 JSON 输出,并且还可以轻松处理参数和分页。未来可能需要考虑的事情。
    猜你喜欢
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多