小编Tre*_*vor的帖子

针对每组最大n个SQL查询的高性能方法

我试图建立需求快速运行回归,拉动从包含我们的Web服务器的所有历史活动数据库Apache的请求的基础设施.为了通过确保我们仍然回退来自较小客户端的请求来提高覆盖率,我想通过检索每个客户端最多n个(为了这个问题,比如10个)请求来确保请求的分发.

我发现这里回答了一些类似的问题,其中最接近的似乎是SQL查询,以便在一系列ID中返回每个ID的前N行,但答案主要是与我已经尝试过的性能无关的解决方案.例如,row_number()分析函数可以准确地获取我们正在寻找的数据:

SELECT
    *
FROM
    (
    SELECT
        dailylogdata.*,
        row_number() over (partition by dailylogdata.contextid order by occurrencedate) rn
    FROM
        dailylogdata
    WHERE
        shorturl in (?)
    )
WHERE
    rn <= 10;
Run Code Online (Sandbox Code Playgroud)

但是,假设此表包含给定日期的数百万条目,并且此方法需要从索引中读取与我们的选择条件匹配的所有行,以便应用row_number分析函数,性能非常糟糕.我们最终选择了将近一百万行,只是因为他们的row_number超过10而抛弃了绝大多数行.执行上述查询时的统计信息:

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|| Id  | Operation                            | Name                    | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  | Writes |  OMem |  1Mem | Used-Mem | Used-Tmp||
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
||   0 | SELECT STATEMENT                     |                         |      1 |        |  12222 |00:09:08.94 |     895K|    584K|    301 |       |       | …
Run Code Online (Sandbox Code Playgroud)

sql oracle performance oltp greatest-n-per-group

5
推荐指数
1
解决办法
889
查看次数

标签 统计

greatest-n-per-group ×1

oltp ×1

oracle ×1

performance ×1

sql ×1