PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Cara mengoptimalkan postgres kueri

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:

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);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sisipan multi-baris dengan pg-promise

  2. Bagaimana mengkonversi integer ke string dan mendapatkan panjang string

  3. Cara membuat Pengguna/Database dalam skrip untuk Docker Postgres

  4. Pembaruan multi-baris PostgreSQL di Node.js

  5. Bagaimana mengkonversi data poligon menjadi segmen garis menggunakan PostGIS