Coba versi yang ditulis ulang ini:
SELECT fat.*
FROM Table1 fat
JOIN conciliacao_vendas cv USING (empresa_id, chavefato, rede_id)
JOIN loja lj ON lj.id = fat.loja_id
JOIN rede rd ON rd.id = fat.rede_id
JOIN bandeira bd ON bd.id = fat.bandeira_id
JOIN produto pd ON pd.id = fat.produto_id
JOIN loja_extensao le ON le.id = fat.loja_extensao_id
JOIN conta ct ON ct.id = fat.conta_id
JOIN banco bc ON bc.id = ct.banco_id
LEFT JOIN modo_captura mc ON mc.id = fat.modo_captura_id
WHERE cv.controle_upload_arquivo_id = 6906
AND fat.parcela = 1
ORDER BY fat.data_venda, fat.data_credito
LIMIT 20;
Sintaksis GABUNG dan urutan gabungan
Secara khusus saya memperbaiki LEFT JOIN
yang menyesatkan ke conciliacao_vendas
, yang dipaksa untuk bertindak sebagai [INNER] JOIN
biasa oleh WHERE
nanti kondisi bagaimanapun. Ini harus menyederhanakan perencanaan kueri dan memungkinkan untuk menghilangkan baris lebih awal dalam proses, yang seharusnya membuat semuanya jauh lebih murah. Jawaban terkait dengan penjelasan rinci:
USING
hanyalah singkatan sintaksis.
Karena ada banyak tabel yang terlibat dalam kueri dan urutan kueri yang ditulis ulang bergabung dengan tabel sudah optimal sekarang, Anda dapat menyempurnakannya dengan SET LOCAL join_collapse_limit = 1
untuk menghemat overhead perencanaan dan menghindari rencana kueri yang lebih rendah. Jalankan dalam satu transaksi :
BEGIN;
SET LOCAL join_collapse_limit = 1;
SELECT ...; -- read data here
COMMIT; -- or ROOLBACK;
Lebih lanjut tentang itu:
- Contoh Kueri untuk menampilkan kesalahan estimasi Kardinalitas di PostgreSQL
- Panduan bagus tentang Mengontrol Planner dengan Eksplisit Klausul GABUNG
Indeks
Tambahkan beberapa indeks pada tabel pencarian dengan banyak atau baris (tidak perlu hanya beberapa lusin), khususnya (diambil dari rencana kueri Anda):
Itu sangat aneh, karena kolom tersebut terlihat seperti kolom kunci utama dan seharusnya sudah memiliki indeks ...
Jadi:
CREATE INDEX conta_pkey_idx ON public.conta (id);
CREATE INDEX loja_pkey_idx ON public.loja (id);
CREATE INDEX loja_extensao_pkey_idx ON public.loja_extensao (id);
Untuk membuatnya sangat gemuk, indeks multikolom akan sangat membantu:
CREATE INDEX foo ON Table1 (parcela, data_venda, data_credito);