Eu uso paginação de cursor e quero exibir meus dados assim:
na parte inferior você pode ir para a página 1 até 29. Para calcular minhas páginas, tenho que contar todas as minhas linhas. Não é pesado toda vez contar todas as linhas? Talvez haja outra solução ou não consigo escapar dela para contar todas as linhas?
Eu também não uso deslocamento, então como posso fazer isso com paginação de cursor?
SELECT
wp.id,
wp.updated_wst,
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,
wst.accepted_by,
wst.accepted_at,
l.name as location
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_send_times wst
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 lo.id = $1 AND wp.tenant_id = $2 AND (wp.id, wp.updated_wst) > ($3, $4)
GROUP BY wp.id, wst.id, u.id, c.id, l.name
ORDER BY wp.id, wp.updated_wst LIMIT 50
Esse é meu código atual. Mas para exibir páginas, tenho que contar linhas e então calculá-las. Como eu faria isso (a melhor maneira de desempenho)?
Se você precisa saber quantas páginas haverá, precisa saber a contagem total do conjunto de resultados, e calcular isso é caro. Além disso, os dados podem mudar, e então as 29 páginas podem realmente se tornar 28 ou 30, então a contagem de páginas é enganosa.
Quero encorajá-lo a não calcular o número de linhas de resultados. Os mecanismos de busca da Web não fazem isso, e eles sabem o porquê. Aqui estão algumas sugestões do que fazer em vez disso:
Simplesmente não mostre o número de páginas. Forneça uma maneira de navegar para a próxima página, 10 páginas ou mais à frente e (talvez) a última página.
Use
EXPLAIN (FORMAT JSON)
na consulta, então você pode facilmente extrair a contagem estimada de linhas do resultado. Isso permite que você diga "página 1 de aproximadamente 29" e deve ser bom o suficiente na maioria dos casos.Se você realmente, verdadeiramente precisa de uma contagem exata de linhas, não a calcule imediatamente. Em vez disso, forneça um botão "contagem exata de linhas" e calcule o resultado (lento) somente quando o usuário insistir.
Este artigo pode ser interessante para você.