Performance degradation in Bitmapscan (commit 75ae538bc3168bf44475240d4e0487ee2f3bb376) - Mailing list pgsql-hackers

From Dilip Kumar
Subject Performance degradation in Bitmapscan (commit 75ae538bc3168bf44475240d4e0487ee2f3bb376)
Date
Msg-id CAFiTN-vagvuAydKG9VnWcoK=ADAhxmOa4ZTrmNsViBBooTnriQ@mail.gmail.com
Whole thread Raw
Responses Re: Performance degradation in Bitmapscan (commit 75ae538bc3168bf44475240d4e0487ee2f3bb376)
List pgsql-hackers
While testing bitmap performance, I have observed that some of the
TPCH queries taking huge time in BitmapIndexScan node, when there are
lossy pages.

I suspected 75ae538bc3168bf44475240d4e0487ee2f3bb376 commit, because
prior to that it used to take very less time. So I tested by reverting
suspected commit and problem is solved.

Here is explained analyze result for TPCH query 6 (scale factor 10)

work_mem=10M
shared_buffers=20GB
machine under test: POWER, 4 socket machine

->On Head:

postgres=# \i 6.explain.sql
                                  QUERY PLAN


--------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------Limit  (cost=1585507.74..1585507.75 rows=1 width=32)
(actual
time=21626.467..21626.467 rows=1 loops=1)  ->  Aggregate  (cost=1585507.74..1585507.75 rows=1 width=32)
(actual time=21626.466..21626.466 rows=1 loops=1)        ->  Bitmap Heap Scan on lineitem  (cost=299632.60..1579529.48
rows=1195652 width=12) (actual time=9204.770..20910.089 rows=1190658
loops=1)              Recheck Cond: ((l_shipdate >= '1995-01-01'::date) AND
(l_shipdate < '1996-01-01 00:00:00'::timestamp without time zone) AND
(l_discount >= 0.07
) AND (l_discount <= 0.09) AND (l_quantity < '25'::numeric))              Rows Removed by Index Recheck: 27584798
      Heap Blocks: exact=101349 lossy=580141              ->  Bitmap Index Scan on idx_lineitem_shipdate
 
(cost=0.00..299333.68 rows=1195652 width=0) (actual
time=9185.490..9185.490 rows=1190658 loops=
1)                    Index Cond: ((l_shipdate >= '1995-01-01'::date)
AND (l_shipdate < '1996-01-01 00:00:00'::timestamp without time zone)
AND (l_discount >=
0.07) AND (l_discount <= 0.09) AND (l_quantity < '25'::numeric))Planning time: 0.675 msExecution time: 21626.838 ms
(10 rows)


->After reverting Commit: 75ae538bc3168bf44475240d4e0487ee2f3bb376
postgres=# \i 6.explain.sql
                                  QUERY PLAN


--------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------Limit  (cost=1585507.74..1585507.75 rows=1 width=32)
(actual
time=12807.293..12807.294 rows=1 loops=1)  ->  Aggregate  (cost=1585507.74..1585507.75 rows=1 width=32)
(actual time=12807.291..12807.291 rows=1 loops=1)        ->  Bitmap Heap Scan on lineitem  (cost=299632.60..1579529.48
rows=1195652 width=12) (actual time=1632.351..12131.552 rows=1190658
loops=1)              Recheck Cond: ((l_shipdate >= '1995-01-01'::date) AND
(l_shipdate < '1996-01-01 00:00:00'::timestamp without time zone) AND
(l_discount >= 0.07
) AND (l_discount <= 0.09) AND (l_quantity < '25'::numeric))              Rows Removed by Index Recheck: 28401743
      Heap Blocks: exact=84860 lossy=596630              ->  Bitmap Index Scan on idx_lineitem_shipdate
 
(cost=0.00..299333.68 rows=1195652 width=0) (actual
time=1613.166..1613.166 rows=1190658 loops=
1)                    Index Cond: ((l_shipdate >= '1995-01-01'::date)
AND (l_shipdate < '1996-01-01 00:00:00'::timestamp without time zone)
AND (l_discount >=
0.07) AND (l_discount <= 0.09) AND (l_quantity < '25'::numeric))Planning time: 0.173 msExecution time: 12807.380 ms
(10 rows)


From above explain analyze result we can see that with commit
75ae538bc3168bf44475240d4e0487ee2f3bb376, Bitmap Index Scan node is
way slower than without this commit.

Perf result:
Head
+   13.12%     0.01%  postgres  postgres            [.] tbm_lossify
+   13.10%    13.10%  postgres  postgres            [.]
tbm_mark_page_lossy
+   12.84%    12.82%  postgres  postgres            [.]
slot_deform_tuple
+    6.94%     0.00%  postgres  postgres            [.] _bt_next
+    6.94%     0.02%  postgres  postgres            [.] _bt_steppage
+    6.55%     0.05%  postgres  postgres            [.] _bt_readpage
+    6.41%     1.00%  postgres  postgres            [.] _bt_checkkeys

After Reverting 75ae538bc3168bf44475240d4e0487ee2f3bb376:
+    0.71%     0.71%  postgres  postgres            [.] cmp_var_common
+    0.62%     0.02%  postgres  postgres            [.] tbm_lossify
+    0.62%     0.62%  postgres  postgres            [.] AllocSetReset
+    0.60%     0.11%  postgres  [kernel.kallsyms]   [k] sys_read
+    0.59%     0.10%  postgres  postgres            [.]
advance_transition_function

I think in new hash implementation, delete from pagetable have severe
performance issue.

Note: If I set work_mem=100MB (no lossy page) then performance is fine.


-- 
Regards,
Dilip Kumar
EnterpriseDB: http://www.enterprisedb.com



pgsql-hackers by date:

Previous
From: Robert Haas
Date:
Subject: Re: Hash Indexes
Next
From: Tom Lane
Date:
Subject: Re: Do we need use more meaningful variables to replace 0 in catalog head files?