Eu tenho uma grande mesa junta nas chaves. O plano de explicação mostra que a maior parte do tempo é gasta na classificação.
Existe algo que eu possa fazer para evitar as grandes etapas de classificação? Posso pré-ordenar a tabela?
Consulte e planeje aqui: https://explain.dalibo.com/plan/15a6a91492g8g935#plan/node/5
Ambas as tabelas já possuem um índice na chave, assim, mas esse índice parece não ser usado:
CREATE UNIQUE INDEX "stage_fact_revenue_900_idx_a" ON "stage"."stage_fact_revenue_900_add_dims" USING BTREE ("date","billed_relation_id","subject_client_id","identifier","revenue_type");
CREATE UNIQUE INDEX "fact_revenue_idx_a" ON "star"."fact_revenue" USING BTREE ("date","identifier","billed_relation_id","subject_client_id","revenue_type");
Um índice acelera a pesquisa se as linhas retornadas não forem superiores a aproximadamente 10%, caso contrário, uma verificação completa da tabela é mais rápida.
O Postgresql escolhe uma varredura completa
stage_fact_revenue_900_add_dims
porque precisa selecionar todas as linhas e precisa de colunas que não estão presentes no índice. Pela mesma razão, ele acha que é melhor digitalizarfact_revenue
uma vez e classificar os resultados em vez de fazer 177 milhões de buscas de índice.Algumas coisas que você pode tentar:
ORDER BY date, identifier, billed_relation_id, subject_client_id, revenue_type
que isso deve sugerir ao Postgres que usar o índicefact_revenue
pode evitar a classificação.Assim: