当您必须计算所有行时,如何处理分页性能?

问题描述 投票:0回答:1

我学习了基于页面的分页和光标分页。对于两者,我需要总计数来显示更多结果或不显示更多结果。问题是我计算每个新页面的所有行,这对性能不利。有没有一种解决方案可以绕过它或以快速的方式完成它?

SELECT 
    wp.id,
    u.id as user_id, u.firstname, u.lastname, 
    c.id as company_id, c.company,
    wst.id as wst_id,
    wst.start_time,
    wst.end_time,
    wst.send_start_at,
    wst.send_end_at,
    l.name as location,
    (SELECT COUNT(wp.id) AS total 
     FROM workers_plan wp
     LEFT JOIN users u ON u.id = wp.user_id
     WHERE wp.tenant_id = $1 
       AND wst.deleted_by IS NULL 
       AND ($3 OR u.company_id = $2)) AS total 
FROM 
    workers_plan wp
LEFT JOIN 
    users u ON u.id = wp.user_id
LEFT JOIN 
    clients c ON c.id = u.company_id
LEFT JOIN 
    workers_plan wp ON wst.workers_plan_id = wp.id
LEFT JOIN 
    location_orders lo ON lo.id = wp.location_orders_id
LEFT JOIN 
    location l ON l.id = lo.location_id  
WHERE 
    wst.tenant_id = $1 
    AND wst.deleted_by IS NULL 
    AND ($3 OR u.company_id = $2)
GROUP BY 
    wp.id, wst.id, u.id, c.id, l.name
ORDER BY 
    wp.id, wp.created_at 
LIMIT 50

在这里您可以看到我有一个子查询,我在其中计算所有行(总计)。每 50 个结果后执行一次。

node.js postgresql
1个回答
0
投票

除了查询不进行任何分页之外,不需要总计数来知道是否有更多结果。

  1. 如果少于
    limit
    结果,则没有更多结果。
  2. 如果恰好有
    limit
    结果,您仍然可以显示“加载更多”,最终会出现在空白页面上。这取决于您是否可以接受。
  3. 如果没有,您可以获取
    limit + 1
    结果并仅显示最多
    limit
    。如果最后一个结果存在(在您的示例中为第 51 个),您就知道还有更多结果。
© www.soinside.com 2019 - 2024. All rights reserved.