Hi all, I have query like this :
select subkategori,produkid, namabarang , sum(keluar) as ttlkeluar, sum(ttlmodal) as ttlmodal from ( select subkategori, kodebarang as produkid, namabarang, keluar, tbltransaksi.modal*keluar as ttlmodal, case when tbltransaksi.discount<=100 then keluar*(harga - (discount/100*harga)) when tbltransaksi.discount>100 then keluar*(harga-discount) end as jumlah from tblpenjualan join tbltransaksi on tblpenjualan.id=tbltransaksi.jualid join tblproduk on tbltransaksi.kodebarang=tblproduk.produkid join tblsubkategori on tblproduk.subkategoriid=tblsubkategori.tblsubkategoriid join tblkategori on tblkategori.kategoriid=tblsubkategori.kategoriid where tblpenjualan.tanggal between '01/01/13' and '31/12/13') as dt group by subkategori, produkid, namabarang Sorry for the foreign language in the field name:) This is the query to collect sales record from specific date and sum the qty based on product id. The problem is : this query takes long time to process. It takes around 48seconds to calculate about 690 thousand record. The explain result is : GroupAggregate (cost=190773.38..209827.25 rows=692868 width=65) Output: tblsubkategori.subkategori, tbltransaksi.kodebarang, tblproduk.namabarang, sum(tbltransaksi.keluar), sum((tbltransaksi.modal * tbltransaksi.keluar)) -> Sort (cost=190773.38..192505.55 rows=692868 width=65) Output: tblsubkategori.subkategori, tbltransaksi.kodebarang, tblproduk.namabarang, tbltransaksi.keluar, tbltransaksi.modal Sort Key: tblsubkategori.subkategori, tbltransaksi.kodebarang, tblproduk.namabarang -> Hash Join (cost=5123.14..69083.49 rows=692868 width=65) Output: tblsubkategori.subkategori, tbltransaksi.kodebarang, tblproduk.namabarang, tbltransaksi.keluar, tbltransaksi.modal Hash Cond: ((tbltransaksi.kodebarang)::text = (tblproduk.produkid)::text) -> Merge Join (cost=0.77..42032.84 rows=692868 width=23) Output: tbltransaksi.kodebarang, tbltransaksi.keluar, tbltransaksi.modal Merge Cond: (tblpenjualan.id = tbltransaksi.jualid) -> Index Scan using tblpenjualan_pkey on public.tblpenjualan (cost=0.29..6662.34 rows=155847 width=4) Output: tblpenjualan.id, tblpenjualan.tanggal, tblpenjualan.noinvoice, tblpenjualan.customer, tblpenjualan.bayar, tblpenjualan.jenis, tblpenjualan.jumlah, tblpenjualan.keterangan, tblpenjualan.jam, tblpenjualan.kassa, tblpenjualan.jatuhtempo, tblpenjualan.cetak, tblpenjualan.modifyby, tblpenjualan.createby, tblpenjualan.sales, tblpenjualan.mesinedc, tblpenjualan.void Filter: ((tblpenjualan.tanggal >= '2013-01-01'::date) AND (tblpenjualan.tanggal <= '2013-12-31'::date)) -> Index Scan using tbltransaksi_idx4 on public.tbltransaksi (cost=0.42..26320.16 rows=692890 width=27) Output: tbltransaksi.id, tbltransaksi.tanggal, tbltransaksi.kodebarang, tbltransaksi.masuk, tbltransaksi.keluar, tbltransaksi.satuan, tbltransaksi.keterangan, tbltransaksi.jenis, tbltransaksi.harga, tbltransaksi.discount, tbltransaksi.jualid, tbltransaksi.beliid, tbltransaksi.mutasiid, tbltransaksi.nobukti, tbltransaksi.customerid, tbltransaksi.modal, tbltransaksi.awalid, tbltransaksi.terimabrgid, tbltransaksi.opnameid, tbltransaksi.returjualid, tbltransaksi.returbeliid -> Hash (cost=3259.85..3259.85 rows=83642 width=55) Output: tblproduk.namabarang, tblproduk.produkid, tblsubkategori.subkategori -> Hash Join (cost=5.35..3259.85 rows=83642 width=55) Output: tblproduk.namabarang, tblproduk.produkid, tblsubkategori.subkategori Hash Cond: ((tblproduk.subkategoriid)::text = (tblsubkategori.tblsubkategoriid)::text) -> Seq Scan on public.tblproduk (cost=0.00..2104.42 rows=83642 width=45) Output: tblproduk.produkid, tblproduk.namabarang, tblproduk.hargajual, tblproduk.subkategoriid, tblproduk.createby, tblproduk.kodepromo, tblproduk.satuan, tblproduk.foto, tblproduk.pajak, tblproduk.listingfee, tblproduk.supplierid, tblproduk.modifyby, tblproduk.qtygrosir, tblproduk.hargagrosir, tblproduk.diskonjual, tblproduk.modal -> Hash (cost=4.23..4.23 rows=90 width=17) Output: tblsubkategori.subkategori, tblsubkategori.tblsubkategoriid -> Hash Join (cost=1.09..4.23 rows=90 width=17) Output: tblsubkategori.subkategori, tblsubkategori.tblsubkategoriid Hash Cond: ((tblsubkategori.kategoriid)::text = (tblkategori.kategoriid)::text) -> Seq Scan on public.tblsubkategori (cost=0.00..1.90 rows=90 width=21) Output: tblsubkategori.tblsubkategoriid, tblsubkategori.subkategori, tblsubkategori.kategoriid -> Hash (cost=1.04..1.04 rows=4 width=38) Output: tblkategori.kategoriid -> Seq Scan on public.tblkategori (cost=0.00..1.04 rows=4 width=38) Output: tblkategori.kategoriid Is there any way to make calculation faster ? I already index the product id field, date and some other. Thanks for any suggestion.