sorry, for now, work_mem=100MB

On Mon, Dec 2, 2013 at 12:33 AM, Hengky Lie <hengkyliwand...@gmail.com>wrote:

> Dear Torsten and friends,
>
> This is another good case to analyse why the query performance is not  the
> same :
>
> There are 2 query :
> (1)
>
> with qry1 as (
> 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/10/13')
>
>
> select subkategori,produkid, namabarang , sum(keluar) as ttlkeluar,
> sum(jumlah) as jumlah, sum(ttlmodal) as ttlmodal
> from qry1
> group by subkategori, produkid, namabarang
>
> "QUERY PLAN"
> "HashAggregate  (cost=99124.61..99780.94 rows=65633 width=334) (actual 
> time=3422.786..3434.511 rows=24198 loops=1)"
> "  Buffers: shared hit=14543"
> "  CTE qry1"
> "    ->  Hash Join  (cost=11676.07..76153.06 rows=656330 width=73) (actual 
> time=181.683..2028.046 rows=657785 loops=1)"
> "          Hash Cond: ((tbltransaksi.kodebarang)::text = 
> (tblproduk.produkid)::text)"
> "          Buffers: shared hit=14543"
> "          ->  Hash Join  (cost=7247.75..44651.13 rows=656330 width=31) 
> (actual time=84.885..787.029 rows=658438 loops=1)"
> "                Hash Cond: (tbltransaksi.jualid = tblpenjualan.id)"
> "                Buffers: shared hit=13204"
> "                ->  Seq Scan on tbltransaksi  (cost=0.00..18730.83 
> rows=807283 width=35) (actual time=0.005..157.004 rows=807033 loops=1)"
> "                      Buffers: shared hit=10658"
> "                ->  Hash  (cost=5293.64..5293.64 rows=156329 width=4) 
> (actual time=84.842..84.842 rows=154900 loops=1)"
> "                      Buckets: 16384  Batches: 1  Memory Usage: 3631kB"
> "                      Buffers: shared hit=2546"
> "                      ->  Seq Scan on tblpenjualan  (cost=0.00..5293.64 
> rows=156329 width=4) (actual time=0.007..49.444 rows=154900 loops=1)"
> "                            Filter: ((tanggal >= '2013-01-01'::date) AND 
> (tanggal <= '2013-10-31'::date))"
> "                            Rows Removed by Filter: 27928"
> "                            Buffers: shared hit=2546"
> "          ->  Hash  (cost=3364.19..3364.19 rows=85130 width=55) (actual 
> time=96.736..96.736 rows=84701 loops=1)"
> "                Buckets: 16384  Batches: 1  Memory Usage: 6323kB"
> "                Buffers: shared hit=1339"
> "                ->  Hash Join  (cost=5.35..3364.19 rows=85130 width=55) 
> (actual time=0.241..62.038 rows=84701 loops=1)"
> "                      Hash Cond: ((tblproduk.subkategoriid)::text = 
> (tblsubkategori.tblsubkategoriid)::text)"
> "                      Buffers: shared hit=1339"
> "                      ->  Seq Scan on tblproduk  (cost=0.00..2188.30 
> rows=85130 width=45) (actual time=0.008..17.549 rows=85035 loops=1)"
> "                            Buffers: shared hit=1337"
> "                      ->  Hash  (cost=4.23..4.23 rows=90 width=17) (actual 
> time=0.224..0.224 rows=90 loops=1)"
> "                            Buckets: 1024  Batches: 1  Memory Usage: 4kB"
> "                            Buffers: shared hit=2"
> "                            ->  Hash Join  (cost=1.09..4.23 rows=90 
> width=17) (actual time=0.028..0.153 rows=90 loops=1)"
> "                                  Hash Cond: 
> ((tblsubkategori.kategoriid)::text = (tblkategori.kategoriid)::text)"
> "                                  Buffers: shared hit=2"
> "                                  ->  Seq Scan on tblsubkategori  
> (cost=0.00..1.90 rows=90 width=21) (actual time=0.005..0.029 rows=90 loops=1)"
> "                                        Buffers: shared hit=1"
> "                                  ->  Hash  (cost=1.04..1.04 rows=4 width=4) 
> (actual time=0.011..0.011 rows=4 loops=1)"
> "                                        Buckets: 1024  Batches: 1  Memory 
> Usage: 1kB"
> "                                        Buffers: shared hit=1"
> "                                        ->  Seq Scan on tblkategori  
> (cost=0.00..1.04 rows=4 width=4) (actual time=0.002..0.004 rows=4 loops=1)"
> "                                              Buffers: shared hit=1"
> "  ->  CTE Scan on qry1  (cost=0.00..13126.60 rows=656330 width=334) (actual 
> time=181.687..2556.526 rows=657785 loops=1)"
> "        Buffers: shared hit=14543"
> "Total runtime: 3454.442 ms"
>
> (2)this is exactly the same query with no.1 except it uses subquery
>
>       select subkategori,produkid, namabarang , sum(keluar) as ttlkeluar, 
> sum(jumlah) as jumlah, 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/10/13')
>
>               as dt group by subkategori, produkid, namabarang
>
> The analyse result :
>
> "QUERY PLAN"
> "GroupAggregate  (cost=124800.44..157616.94 rows=656330 width=73) (actual 
> time=13895.782..15236.212 rows=24198 loops=1)"
> "  Buffers: shared hit=14543"
> "  ->  Sort  (cost=124800.44..126441.26 rows=656330 width=73) (actual 
> time=13895.750..14024.911 rows=657785 loops=1)"
> "        Sort Key: tblsubkategori.subkategori, tbltransaksi.kodebarang, 
> tblproduk.namabarang"
> "        Sort Method: quicksort  Memory: 103431kB"
> "        Buffers: shared hit=14543"
> "        ->  Hash Join  (cost=11676.07..61385.63 rows=656330 width=73) 
> (actual time=177.521..1264.431 rows=657785 loops=1)"
> "              Hash Cond: ((tbltransaksi.kodebarang)::text = 
> (tblproduk.produkid)::text)"
> "              Buffers: shared hit=14543"
> "              ->  Hash Join  (cost=7247.75..44651.13 rows=656330 width=31) 
> (actual time=84.473..739.064 rows=658438 loops=1)"
> "                    Hash Cond: (tbltransaksi.jualid = tblpenjualan.id)"
> "                    Buffers: shared hit=13204"
> "                    ->  Seq Scan on tbltransaksi  (cost=0.00..18730.83 
> rows=807283 width=35) (actual time=0.005..146.601 rows=807033 loops=1)"
> "                          Buffers: shared hit=10658"
> "                    ->  Hash  (cost=5293.64..5293.64 rows=156329 width=4) 
> (actual time=84.429..84.429 rows=154900 loops=1)"
> "                          Buckets: 16384  Batches: 1  Memory Usage: 3631kB"
> "                          Buffers: shared hit=2546"
> "                          ->  Seq Scan on tblpenjualan  (cost=0.00..5293.64 
> rows=156329 width=4) (actual time=0.008..48.968 rows=154900 loops=1)"
> "                                Filter: ((tanggal >= '2013-01-01'::date) AND 
> (tanggal <= '2013-10-31'::date))"
> "                                Rows Removed by Filter: 27928"
> "                                Buffers: shared hit=2546"
> "              ->  Hash  (cost=3364.19..3364.19 rows=85130 width=55) (actual 
> time=92.998..92.998 rows=84701 loops=1)"
> "                    Buckets: 16384  Batches: 1  Memory Usage: 6323kB"
> "                    Buffers: shared hit=1339"
> "                    ->  Hash Join  (cost=5.35..3364.19 rows=85130 width=55) 
> (actual time=0.240..59.587 rows=84701 loops=1)"
> "                          Hash Cond: ((tblproduk.subkategoriid)::text = 
> (tblsubkategori.tblsubkategoriid)::text)"
> "                          Buffers: shared hit=1339"
> "                          ->  Seq Scan on tblproduk  (cost=0.00..2188.30 
> rows=85130 width=45) (actual time=0.008..16.942 rows=85035 loops=1)"
> "                                Buffers: shared hit=1337"
> "                          ->  Hash  (cost=4.23..4.23 rows=90 width=17) 
> (actual time=0.221..0.221 rows=90 loops=1)"
> "                                Buckets: 1024  Batches: 1  Memory Usage: 4kB"
> "                                Buffers: shared hit=2"
> "                                ->  Hash Join  (cost=1.09..4.23 rows=90 
> width=17) (actual time=0.028..0.142 rows=90 loops=1)"
> "                                      Hash Cond: 
> ((tblsubkategori.kategoriid)::text = (tblkategori.kategoriid)::text)"
> "                                      Buffers: shared hit=2"
> "                                      ->  Seq Scan on tblsubkategori  
> (cost=0.00..1.90 rows=90 width=21) (actual time=0.006..0.046 rows=90 loops=1)"
> "                                            Buffers: shared hit=1"
> "                                      ->  Hash  (cost=1.04..1.04 rows=4 
> width=4) (actual time=0.012..0.012 rows=4 loops=1)"
> "                                            Buckets: 1024  Batches: 1  
> Memory Usage: 1kB"
> "                                            Buffers: shared hit=1"
> "                                            ->  Seq Scan on tblkategori  
> (cost=0.00..1.04 rows=4 width=4) (actual time=0.002..0.005 rows=4 loops=1)"
> "                                                  Buffers: shared hit=1"
> "Total runtime: 15244.038 ms"
>
> This is my  Postgresqlconf :
> max_connections=50
> shared_buffers=1024MB
> wall_buffers=16MB
> max_prepared_transactions=0
> work_mem=50MB
> maintenance_work_mem=256MB
>
> Thanks
>
>
> On Sun, Dec 1, 2013 at 9:39 PM, Torsten Förtsch 
> <torsten.foert...@gmx.net>wrote:
>
>> On 01/12/13 13:40, Hengky Liwandouw wrote:
>> > Torsten, your 2nd option works now. I dont know maybe copy and paste
>> error. I just want to report that your 2nd option with work_mem=100MB
>> required the same amount of time (about 58 seconds), while my query
>> required 4.9 seconds.
>> >
>> > What make this two query so different ?
>> >
>> Without the "explain (analyze,buffers) ..." it's hard to say. A CTE is
>> currently a way to trick the query planner because it's planned
>> separately. A subquery on the other hand is integrated in the outer
>> query and planned/optimized as one thing.
>>
>> If your planner parameters are correctly set up, the subquery should
>> almost always outrun the CTE. Often, though, not much.
>>
>> Now, you may ask why CTE then exist at all? There are things that cannot
>> be expressed without them, in particular WITH RECURSIVE.
>>
>> The fact that it performs so badly as a subquery indicates that either
>> your table statistics are suboptimal or more probably the planner
>> parameters or work_mem.
>>
>> Another point I have just noticed, how does it perform if you change
>>
>>   and extract(... from tanggal)='2013'
>>
>> to
>>
>>   and '2013-01-01'::date <= tanggal
>>   and tanggal < '2013-01-01'::date + '1 year'::interval
>>
>> Also, I think it would be possible to even get rid of the subquery. At
>> least you can get rid of the tanggal and jumlah output from the subquery.
>>
>> select s.id, s.nama, t.kodebarang, p.namabarang,
>>        sum(case when extract(month from t.tanggal) = 1
>>                 then t.keluar else 0 end) as jan,
>>        sum(case when extract(month from t.tanggal) = 2
>>                 then t.keluar else 0 end) as feb,
>>        ...,
>>        sum(t.keluar) as total
>>   from tbltransaksi t
>>   join tblproduk p on t.kodebarang=p.produkid
>>   join tblsupplier s on p.supplierid=s.id
>>  where (t.jualid is not null or t.returjualid is not null)
>>    and '2013-01-01'::date <= t.tanggal
>>    and t.tanggal < '2013-01-01'::date + '1 year'::interval
>>  group by s.id, s.nama, t.kodebarang, p.namabarang
>>  order by total desc
>>  limit 1000
>>
>> would be interesting to see the "explain (analyze,buffers)" output for
>> the query above.
>>
>> Please double-check the query. I think it should do exactly the same as
>> your query. But you know, shit happens.
>>
>> BTW, am I right in assuming that you are from Malaysia or Indonesia? I
>> am trying to learn a bit of Malay. I am a complete beginner, though.
>>
>> Selamat berjaya      (is that possible to wish you success?)
>> Torsten
>>
>
>

Reply via email to