F.7. bloom â индекÑнÑй меÑод доÑÑÑпа, оÑнованнÑй на ÑилÑÑÑÐ°Ñ ÐлÑма #
ÐодÑÐ»Ñ bloom пÑедоÑÑавлÑÐµÑ Ð¸Ð½Ð´ÐµÐºÑнÑй меÑод доÑÑÑпа, оÑнованнÑй на ÑилÑÑÑаÑ
ÐлÑма.
ФилÑÑÑ ÐлÑма пÑедÑÑавлÑÐµÑ Ñобой компакÑнÑÑ ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ , позволÑÑÑÑÑ Ð¿ÑовеÑиÑÑ, ÑвлÑеÑÑÑ Ð»Ð¸ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñленом множеÑÑва. Рвиде меÑода доÑÑÑпа индекÑа он позволÑÐµÑ Ð±ÑÑÑÑо иÑклÑÑаÑÑ Ð½ÐµÐ¿Ð¾Ð´Ñ Ð¾Ð´ÑÑие коÑÑежи по ÑигнаÑÑÑам, ÑÐ°Ð·Ð¼ÐµÑ ÐºÐ¾ÑоÑÑÑ Ð¾Ð¿ÑеделÑеÑÑÑ Ð¿Ñи Ñоздании индекÑа.
СигнаÑÑÑа â ÑÑо неÑоÑное пÑедÑÑавление пÑоиндекÑиÑованнÑÑ Ð°ÑÑибÑÑов, вÑледÑÑвие Ñего оно допÑÑÐºÐ°ÐµÑ Ð»Ð¾Ð¶Ð½Ñе положиÑелÑнÑе ÑÑабаÑÑваниÑ; Ñо еÑÑÑ Ð¾Ð½Ð¾ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÐºÐ°Ð·ÑваÑÑ, ÑÑо ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑодеÑжиÑÑÑ Ð² множеÑÑве, Ñ Ð¾ÑÑ ÑÑо не Ñак. ÐоÑÑÐ¾Ð¼Ñ ÑезÑлÑÑаÑÑ Ð¿Ð¾Ð¸Ñка по ÑÐ°ÐºÐ¾Ð¼Ñ Ð¸Ð½Ð´ÐµÐºÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²Ñегда пеÑепÑовеÑÑÑÑÑÑ Ð¿Ð¾ ÑакÑиÑеÑким знаÑениÑм аÑÑибÑÑов запиÑи в ÑаблиÑе. Чем болÑÑе ÑÐ°Ð·Ð¼ÐµÑ ÑигнаÑÑÑÑ, Ñем менÑÑе веÑоÑÑноÑÑÑ Ð»Ð¾Ð¶Ð½Ð¾Ð³Ð¾ ÑÑабаÑÑÐ²Ð°Ð½Ð¸Ñ Ð¸ ÑиÑло напÑаÑнÑÑ Ð¾Ð±ÑаÑений к ÑаблиÑе, но ÑÑо, ÑазÑмееÑÑÑ, влеÑÑÑ ÑвелиÑение индекÑа и замедление ÑканиÑованиÑ.
ÐÑÐ¾Ñ Ñип индекÑа наиболее полезен, когда в ÑаблиÑе много аÑÑибÑÑов и в запÑоÑÐ°Ñ Ð¿ÑовеÑÑÑÑÑÑ Ð¸Ñ Ð¿ÑоизволÑнÑе ÑоÑеÑаниÑ. ТÑадиÑионнÑй индекÑ-B-деÑево бÑÑÑÑее индекÑа ÐлÑма, но Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки вÑевозможнÑÑ Ð·Ð°Ð¿ÑоÑов Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво индекÑов Ñипа B-деÑево, пÑи Ñом ÑÑо Ð¸Ð½Ð´ÐµÐºÑ ÐлÑма нÑжен вÑего один. ÐамеÑÑÑе, однако, ÑÑо индекÑÑ ÐлÑма поддеÑживаÑÑ ÑолÑко пÑовеÑки на ÑавенÑÑво, Ñогда как индекÑÑ-B-деÑевÑÑ Ñакже Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ Ð¿Ñи пÑовеÑке неÑавенÑÑв и поиÑке в диапазоне.
F.7.1. ÐаÑамеÑÑÑ #
ÐÐ½Ð´ÐµÐºÑ bloom пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð² ÑвоÑм пÑедложении WITH ÑледÑÑÑие паÑамеÑÑÑ:
lengthÐлина каждой ÑигнаÑÑÑÑ (ÑлеменÑа индекÑа) в биÑÐ°Ñ , окÑÑглÑÐ½Ð½Ð°Ñ Ð²Ð²ÐµÑÑ Ð´Ð¾ ближайÑего ÑиÑла, кÑаÑного
16. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ â80, а макÑималÑное знаÑение â4096.
col1 â col32ЧиÑло биÑов, генеÑиÑÑемÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÑолбÑа индекÑа. Римени паÑамеÑÑа оÑÑажаеÑÑÑ Ð½Ð¾Ð¼ÐµÑ ÑÑолбÑа индекÑа, Ð´Ð»Ñ ÐºÐ¾ÑоÑого ÑÑо ÑиÑло задаÑÑÑÑ. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ â
2биÑа, а макÑимÑм â4095. ÐаÑамеÑÑÑ Ð´Ð»Ñ Ð½ÐµÐ¸ÑполÑзÑемÑÑ ÑÑолбÑов индекÑа игноÑиÑÑÑÑÑÑ.
F.7.2. ÐÑимеÑÑ #
ÐÑÐ¸Ð¼ÐµÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа bloom:
CREATE INDEX bloomidx ON tbloom USING bloom (i1,i2,i3)
WITH (length=80, col1=2, col2=2, col3=4);ÐÑа команда ÑоздаÑÑ Ð¸Ð½Ð´ÐµÐºÑ Ñ Ð´Ð»Ð¸Ð½Ð¾Ð¹ ÑигнаÑÑÑÑ 80 биÑ, в коÑоÑой аÑÑибÑÑÑ i1 и i2 оÑобÑажаÑÑÑÑ Ð² 2 биÑа, а аÑÑибÑÑ i3 â в 4. ÐÑ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ Ð¾Ð¿ÑÑÑиÑÑ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ length, col1 и col2, Ñак как в ниÑ
задаÑÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ.
Ðиже пÑедÑÑавлен более полнÑй пÑÐ¸Ð¼ÐµÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸ иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа ÐлÑма, а Ñакже пÑиводиÑÑÑ ÑÑавнение его Ñ ÑавнознаÑнÑм индекÑом-B-деÑевом. Ðидно, ÑÑо Ð¸Ð½Ð´ÐµÐºÑ ÐлÑма знаÑиÑелÑно менÑÑе индекÑа-B-деÑева, и пÑи ÑÑом он Ð¼Ð¾Ð¶ÐµÑ ÑабоÑаÑÑ Ð±ÑÑÑÑее.
=# CREATE TABLE tbloom AS
SELECT
(random() * 1000000)::int as i1,
(random() * 1000000)::int as i2,
(random() * 1000000)::int as i3,
(random() * 1000000)::int as i4,
(random() * 1000000)::int as i5,
(random() * 1000000)::int as i6
FROM
generate_series(1,10000000);
SELECT 10000000ÐоÑледоваÑелÑное ÑканиÑование по ÑÑой болÑÑой ÑаблиÑе вÑполнÑеÑÑÑ Ð´Ð¾Ð»Ð³Ð¾:
=# EXPLAIN ANALYZE SELECT * FROM tbloom WHERE i2 = 898732 AND i5 = 123451;
QUERY PLAN
-------------------------------------------------------------------â-----------------------------------
Seq Scan on tbloom (cost=0.00..213744.00 rows=250 width=24) (actual time=357.059..357.059 rows=0 loops=1)
Filter: ((i2 = 898732) AND (i5 = 123451))
Rows Removed by Filter: 10000000
Planning Time: 0.346 ms
Execution Time: 357.076 ms
(5 rows)Ðаже пÑи налиÑии индекÑа btree ÑканиÑование оÑÑаÑÑÑÑ Ð¿Ð¾ÑледоваÑелÑнÑм:
=# CREATE INDEX btreeidx ON tbloom (i1, i2, i3, i4, i5, i6);
CREATE INDEX
=# SELECT pg_size_pretty(pg_relation_size('btreeidx'));
pg_size_pretty
----------------
386 MB
(1 row)
=# EXPLAIN ANALYZE SELECT * FROM tbloom WHERE i2 = 898732 AND i5 = 123451;
QUERY PLAN
-------------------------------------------------------------------â-----------------------------------
Seq Scan on tbloom (cost=0.00..213744.00 rows=2 width=24) (actual time=351.016..351.017 rows=0 loops=1)
Filter: ((i2 = 898732) AND (i5 = 123451))
Rows Removed by Filter: 10000000
Planning Time: 0.138 ms
Execution Time: 351.035 ms
(5 rows)ÐÑли же Ð´Ð»Ñ ÑаблиÑÑ Ñоздан Ð¸Ð½Ð´ÐµÐºÑ bloom, поиÑк Ñакого Ñода вÑполнÑеÑÑÑ ÑÑÑекÑивнее, Ñем Ñ Ð¸Ð½Ð´ÐµÐºÑом btree:
=# CREATE INDEX bloomidx ON tbloom USING bloom (i1, i2, i3, i4, i5, i6);
CREATE INDEX
=# SELECT pg_size_pretty(pg_relation_size('bloomidx'));
pg_size_pretty
----------------
153 MB
(1 row)
=# EXPLAIN ANALYZE SELECT * FROM tbloom WHERE i2 = 898732 AND i5 = 123451;
QUERY PLAN
-------------------------------------------------------------------â--------------------------------------------------
Bitmap Heap Scan on tbloom (cost=1792.00..1799.69 rows=2 width=24) (actual time=22.605..22.606 rows=0 loops=1)
Recheck Cond: ((i2 = 898732) AND (i5 = 123451))
Rows Removed by Index Recheck: 2300
Heap Blocks: exact=2256
-> Bitmap Index Scan on bloomidx (cost=0.00..178436.00 rows=1 width=0) (actual time=20.005..20.005 rows=2300 loops=1)
Index Cond: ((i2 = 898732) AND (i5 = 123451))
Planning Time: 0.099 ms
Execution Time: 22.632 ms
(8 rows)ÐÑи Ñаком Ð¿Ð¾Ð´Ñ Ð¾Ð´Ðµ оÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð¿Ñоблема поиÑка по B-деÑÐµÐ²Ñ ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо B-деÑево неÑÑÑекÑивно, когда ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ð¾Ð¸Ñка не огÑаниÑиваÑÑ Ð²ÐµÐ´ÑÑие ÑÑолбÑÑ Ð¸Ð½Ð´ÐµÐºÑа. ÐоÑÑомÑ, пÑименÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ Ñипа B-деÑево, лÑÑÑе ÑоздаваÑÑ Ð¾ÑделÑнÑе индекÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÑолбÑа. Ð ÑÑом ÑлÑÑае планиÑовÑик поÑÑÑÐ¾Ð¸Ñ Ð¿ÑимеÑно Ñакой план:
=# CREATE INDEX btreeidx1 ON tbloom (i1);
CREATE INDEX
=# CREATE INDEX btreeidx2 ON tbloom (i2);
CREATE INDEX
=# CREATE INDEX btreeidx3 ON tbloom (i3);
CREATE INDEX
=# CREATE INDEX btreeidx4 ON tbloom (i4);
CREATE INDEX
=# CREATE INDEX btreeidx5 ON tbloom (i5);
CREATE INDEX
=# CREATE INDEX btreeidx6 ON tbloom (i6);
CREATE INDEX
=# EXPLAIN ANALYZE SELECT * FROM tbloom WHERE i2 = 898732 AND i5 = 123451;
QUERY PLAN
-------------------------------------------------------------------â--------------------------------------------------------
Bitmap Heap Scan on tbloom (cost=9.29..13.30 rows=1 width=24) (actual time=0.032..0.033 rows=0 loops=1)
Recheck Cond: ((i5 = 123451) AND (i2 = 898732))
-> BitmapAnd (cost=9.29..9.29 rows=1 width=0) (actual time=0.047..0.047 rows=0 loops=1)
-> Bitmap Index Scan on btreeidx5 (cost=0.00..4.52 rows=11 width=0) (actual time=0.026..0.026 rows=7 loops=1)
Index Cond: (i5 = 123451)
-> Bitmap Index Scan on btreeidx2 (cost=0.00..4.52 rows=11 width=0) (actual time=0.007..0.007 rows=8 loops=1)
Index Cond: (i2 = 898732)
Planning Time: 0.264 ms
Execution Time: 0.047 ms
(9 rows)ХоÑÑ ÑÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð²ÑполнÑеÑÑÑ Ð³Ð¾Ñаздо бÑÑÑÑее, Ñем Ñ ÐºÐ°ÐºÐ¸Ð¼-либо одиноÑнÑм индекÑом, Ð¼Ñ Ð¿Ð»Ð°Ñим за ÑÑо ÑвелиÑением ÑазмеÑа индекÑа. ÐаждÑй индекÑ-B-деÑево Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ 88.5 ÐбайÑа, Ñак ÑÑо обÑий обÑÑм индекÑов ÑоÑÑавлÑÐµÑ 531 ÐбайÑ, ÑÑо в более 3 Ñаз болÑÑе ÑазмеÑа индекÑа ÐлÑма.
F.7.3. ÐнÑеÑÑÐµÐ¹Ñ ÐºÐ»Ð°ÑÑа опеÑаÑоÑов #
ÐлаÑÑ Ð¾Ð¿ÐµÑаÑоÑов Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑов ÐлÑма ÑÑебÑÐµÑ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ ÑолÑко Ñ
еÑ-ÑÑнкÑии Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑиÑÑемого Ñипа даннÑÑ
и опеÑаÑоÑа ÑавенÑÑва Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка. ÐÑÐ¾Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ð´ÐµÐ¼Ð¾Ð½ÑÑÑиÑÑÐµÑ ÑооÑвеÑÑÑвÑÑÑее опÑеделение клаÑÑа опеÑаÑоÑов Ð´Ð»Ñ Ñипа text:
CREATE OPERATOR CLASS text_ops
DEFAULT FOR TYPE text USING bloom AS
OPERATOR 1 =(text, text),
FUNCTION 1 hashtext(text);F.7.4. ÐгÑаниÑÐµÐ½Ð¸Ñ #
Ð ÑÑÐ¾Ñ Ð¼Ð¾Ð´ÑÐ»Ñ Ð²ÐºÐ»ÑÑÐµÐ½Ñ ÑолÑко клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов длÑ
int4иtext.ÐÑи поиÑке поддеÑживаеÑÑÑ ÑолÑко опеÑаÑоÑ
=. Ðо в бÑдÑÑем возможно добавление поддеÑжки Ð´Ð»Ñ Ð¼Ð°ÑÑивов Ñ Ð¾Ð¿ÐµÑаÑиÑми обÑÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¸ пеÑеÑеÑениÑ.ÐеÑод доÑÑÑпа
bloomне поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑникалÑнÑе индекÑÑ (UNIQUE).ÐеÑод доÑÑÑпа
bloomне поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾Ð¸Ñк знаÑенийNULL.
F.7.5. ÐвÑоÑÑ #
ФÑÐ´Ð¾Ñ Ð¡Ð¸Ð³Ð°ÐµÐ² <[email protected]>, Postgres Professional, ÐоÑква, РоÑÑиÑ
ÐлекÑÐ°Ð½Ð´Ñ ÐоÑоÑков <[email protected]>, Postgres Professional, ÐоÑква, РоÑÑиÑ
Ðлег ÐаÑÑÑнов <[email protected]>, Postgres Professional, ÐоÑква, РоÑÑиÑ