我试图建立需求快速运行回归,拉动从包含我们的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)