2016-01-28 16:33 GMT-02:00 Igor Neyman <iney...@perceptron.com>:

>
>
> *From:* pgsql-general-ow...@postgresql.org [mailto:
> pgsql-general-ow...@postgresql.org] *On Behalf Of *Felipe Santos
> *Sent:* Thursday, January 28, 2016 1:17 PM
> *To:* Joshua D. Drake <j...@commandprompt.com>
> *Cc:* Melvin Davidson <melvin6...@gmail.com>; David Rowley <
> david.row...@2ndquadrant.com>; pgsql-general@postgresql.org; Thomas
> Kellerer <spam_ea...@gmx.net>
> *Subject:* Re: [GENERAL] BRIN indexes
>
>
>
> "Further to the point, it is self defeating to have more than one BRIN
> index on the table if the columns involved would have mutually
> non-adjacent pages."
>
>
>
>    Not really, if both columns are ordered, BRIN will work
>
>
>
> "Therefore, it actually would be good to state that in the documentation,
> even it were just a comment."
>
>
>
>    It is = "BRIN is designed for handling very large tables in which
> certain columns have some natural correlation with their physical location
> within the table"
>
>    Link: http://www.postgresql.org/docs/devel/static/brin-intro.html
>
>
>
>
>
> Also, I did some tests and here are the results I got:
>
>
>
> Query with no index = completion time 43s
>
> Same Query with BRIN = completion time 14s / index size 0,5 MB
>
> Same Query without BRIN and with BTREE = completion time 10s / index size
> 5.000,00 MB
>
>
>
> As you can see, BRIN can save 99% of disk space for just a slightly worse
> performance.
>
>
>
> It seems like a huge improvement, given that your data fits BRIN's use
> case.
>
>
>
> Felipe,
>
>
>
> What kind of queries you used in your test?
>
> Where they based on clustering columns?
>
>
>
> Regards
>
> Igor Neyman
>


Hello Igor,

I took the sample BRIN test from the new release's wiki and added the BTREE
test:
https://wiki.postgresql.org/wiki/What%27s_new_in_PostgreSQL_9.5#BRIN_Indexes

The results today may vary from the reported above but are still in the
same levels of performance gain:

brin_db=# CREATE TABLE orders (
brin_db(#      id int,
brin_db(#      order_date timestamptz,
brin_db(#      item text);
CREATE TABLE

brin_db=# INSERT INTO orders (order_date, item)
brin_db-#  SELECT x, 'dfiojdso'
brin_db-#  FROM generate_series('2000-01-01 00:00:00'::timestamptz,
'2015-03-01 00:00:00'::timestamptz,'2 seconds'::interval) a(x);
INSERT 0 239243401

brin_db=# \dt+ orders
                    List of relations
 Schema |  Name  | Type  |  Owner   | Size  | Description
--------+--------+-------+----------+-------+-------------
 public | orders | table | postgres | 12 GB |
(1 row)

brin_db=# EXPLAIN ANALYSE SELECT count(*) FROM orders WHERE order_date
BETWEEN '2012-01-04 09:00:00' and '2014-01-04 14:30:00';

 QUERY PLAN


------------------------------------------------------------------------------------------------------------------------------------------------------
-------
 Aggregate  (cost=4108912.01..4108912.02 rows=1 width=0) (actual
time=81116.722..81116.722 rows=1 loops=1)
   ->  Seq Scan on orders  (cost=0.00..4106759.58 rows=860972 width=0)
(actual time=60173.531..78566.113 rows=31589101 loops=1)
         Filter: ((order_date >= '2012-01-04 09:00:00-02'::timestamp with
time zone) AND (order_date <= '2014-01-04 14:30:00-02'::timestamp with time
zone))
         Rows Removed by Filter: 207654300
 Planning time: 0.443 ms
 Execution time: 81118.168 ms
(6 rows)

brin_db=#  CREATE INDEX idx_order_date_brin
brin_db-#    ON orders
brin_db-#    USING BRIN (order_date);
CREATE INDEX

brin_db=# \di+ idx_order_date_brin
                                List of relations
 Schema |        Name         | Type  |  Owner   | Table  |  Size  |
Description
--------+---------------------+-------+----------+--------+--------+-------------
 public | idx_order_date_brin | index | postgres | orders | 432 kB |
(1 row)

brin_db=# EXPLAIN ANALYSE SELECT count(*) FROM orders WHERE order_date
BETWEEN '2012-01-04 09:00:00' and '2014-01-04 14:30:00';

  QUERY PLAN

------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------
 Aggregate  (cost=2408269.34..2408269.35 rows=1 width=0) (actual
time=14164.923..14164.923 rows=1 loops=1)
   ->  Bitmap Heap Scan on orders  (cost=326808.28..2328609.76
rows=31863832 width=0) (actual time=42.742..11430.562 rows=31589101 loops=1)
         Recheck Cond: ((order_date >= '2012-01-04 09:00:00-02'::timestamp
with time zone) AND (order_date <= '2014-01-04 14:30:00-02'::timestamp with
 time zone))
         Rows Removed by Index Recheck: 21907
         Heap Blocks: lossy=201344
         ->  Bitmap Index Scan on idx_order_date_brin
 (cost=0.00..318842.32 rows=31863832 width=0) (actual time=36.151..36.151
rows=2013440 loops=1)
               Index Cond: ((order_date >= '2012-01-04
09:00:00-02'::timestamp with time zone) AND (order_date <= '2014-01-04
14:30:00-02'::timestamp
with time zone))
 Planning time: 0.297 ms
 Execution time: 14164.985 ms
(9 rows)

brin_db=# drop index idx_order_date_brin ;
DROP INDEX

brin_db=# create index idx_order_date_btree on orders(order_date);
CREATE INDEX

brin_db=# \di+ idx_order_date_btree
                                 List of relations
 Schema |         Name         | Type  |  Owner   | Table  |  Size   |
Description
--------+----------------------+-------+----------+--------+---------+-------------
 public | idx_order_date_btree | index | postgres | orders | 5125 MB |
(1 row)

brin_db=# EXPLAIN ANALYSE SELECT count(*) FROM orders WHERE order_date
BETWEEN '2012-01-04 09:00:00' and '2014-01-04 14:30:00';

 QUERY PLAN

------------------------------------------------------------------------------------------------------------------------------------------------------
-----------
 Aggregate  (cost=1269366.79..1269366.80 rows=1 width=0) (actual
time=10435.148..10435.148 rows=1 loops=1)
   ->  Index Only Scan using idx_order_date_btree on orders
 (cost=0.57..1189707.21 rows=31863832 width=0) (actual time=0.656..7919.754
rows=31589101
loops=1)
         Index Cond: ((order_date >= '2012-01-04 09:00:00-02'::timestamp
with time zone) AND (order_date <= '2014-01-04 14:30:00-02'::timestamp with
t
ime zone))
         Heap Fetches: 31589101
 Planning time: 6.285 ms
 Execution time: 10435.197 ms
(6 rows)


Att.,

Felipe

Reply via email to