官术网_书友最值得收藏!

  • Mastering PostgreSQL 9.6
  • Hans Jurgen Schonig
  • 354字
  • 2021-07-09 19:57:21

BRIN indexes

Block range indexes (BRIN) are of great practical use. All indexes discussed until now need quite a lot of disk space. Although a lot of work has gone into shrinking GIN indexes and the like, they still need quite a lot because an index pointer is needed for each entry. So if there are 10 million entries, there will be 10 million index pointers. Space is the main concern addressed by BRIN indexes. A BRIN index does not keep an index entry for each tuple but will store the minimum and the maximum value of 128 (default) blocks of data (1 MB). The index is therefore very small but lossy. Scanning the index will return more data than we asked for. PostgreSQL has to filter out those additional rows in a later step.

The following example demonstrates how small a BRIN index really is:

test=# CREATE INDEX idx_brin ON t_test USING brin(id); 
CREATE INDEX
test=# \di+ idx_brin
List of relations
Schema | Name | Type | Owner | Table | Size
--------+----------+-------+-------+--------+-------+-------------
public | idx_brin | index | hs | t_test | 48 KB
(1 row)

In my example, the BRIN index is 2,000 times smaller than a standard B-tree. The question naturally arising now is: why don't we always use BRIN indexes? To answer this kind of question, it is important to reflect on the layout of BRIN; the minimum and maximum value for 1 MB are stored. If the data is sorted (high correlation), BRIN is pretty efficient because we can fetch 1 MB of data, scan it, and we are done. However, what if data is shuffled? In this case, BRIN won't be able to exclude chunks of data anymore because it is very likely that something close to the overall high and the overall low is within 1 MB of data. Therefore, BRIN is mostly made for highly correlated data. In reality, correlated data is quite likely in data warehousing applications. Often data is loaded every day and therefore dates can be highly correlated.

主站蜘蛛池模板: 常山县| 云梦县| 永德县| 师宗县| 灌南县| 治多县| 云和县| 岳池县| 山西省| 静安区| 余干县| 卢龙县| 桐柏县| 甘肃省| 大宁县| 双城市| 深圳市| 凤台县| 句容市| 德安县| 石门县| 武陟县| 宜黄县| 新巴尔虎左旗| 当雄县| 霍城县| 华坪县| 乾安县| 沙田区| 甘洛县| 新安县| 肥城市| 新疆| 平阴县| 马鞍山市| 孟津县| 金坛市| 教育| 金乡县| 伊吾县| 于都县|