Eu tenho uma tabela billing_billcycleorders
que contém uma chave estrangeira billing_cycle_id
. Existem cerca de 0,9 milhão de registros para um arquivo billing_cycle_id
. Desejo selecionar os dados nos blocos para ~ 5000 (ou da melhor maneira possível).
O resultado da consulta aumenta exponencialmente para valores de billing_cycle_id
com o maior número de registros.
Eu corri EXPLAIN ANALYZE
na consulta
EXPLAIN (ANALYZE, BUFFERS, VERBOSE, format text)
SELECT DISTINCT
"billing_billcycleorders"."id",
"billing_billcycleorders"."created",
"billing_billcycleorders"."updated",
"billing_billcycleorders"."deleted",
"billing_billcycleorders"."deleted_date",
"billing_billcycleorders"."billing_cycle_id",
"billing_billcycleorders"."order_id",
"billing_billcycleorders"."pickrr_awb",
"billing_billcycleorders"."amount",
"billing_billcycleorders"."delivery_bill",
"billing_billcycleorders"."rto_bill",
"billing_billcycleorders"."pickup_bill",
"billing_billcycleorders"."surcharge",
"billing_billcycleorders"."cod_bill",
"billing_billcycleorders"."qc_bill",
"billing_billcycleorders"."qcf_bill",
"billing_billcycleorders"."secure_shipment_charge",
"billing_billcycleorders"."cod_amount",
"billing_billcycleorders"."meta_details"
FROM
"billing_billcycleorders"
WHERE
(
"billing_billcycleorders"."billing_cycle_id" = 685081 AND "billing_billcycleorders"."id" > 0
)
ORDER BY "billing_billcycleorders"."id" ASC
LIMIT 1000
Explique Analisar: https://explain.depesz.com/s/k9rq7
Paginar uma tabela com
OFFSET
/LIMIT
incorre no custo de percorrer o número combinado de linhas e fica cada vez mais caro.Em vez disso, baseie suas páginas de dados em um índice. Você pode começar
LIMIT 1000
como está, mas em vez deOFFSET
nas páginas subsequentes, use:$greatest_id_of_last_batch
sendo o maior ID da página de dados anterior. Isso corresponde à sua ordem de classificaçãoORDER BY "billing_billcycleorders"."id" ASC
. Eid
é o PK, então é único.Certifique-se de ter um índice de várias colunas ativado
(billing_cycle_id, id)
para suportar isso. Ver:E, claro, solte o
DISTINCT
no topo, isso não está fazendo nada de útil nesta consulta (exceto tornando-a cara).À parte: com um milhão de linhas por ciclo de cobrança, particionar a tabela por lista
billing_cycle_id
pode ser uma boa opção ...