Home Explore Blog CI



postgresql

4th chunk of `doc/src/sgml/bloom.sgml`
616cf3351019561c11b5fb140358cd70b60993fabc8eea300000000100000d1e
 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
-------------------------------------------------------------------&zwsp;--------------------------------------------------------
 Bitmap Heap Scan on tbloom  (cost=9.29..13.30 rows=1 width=24) (actual time=0.032..0.033 rows=0.00 loops=1)
   Recheck Cond: ((i5 = 123451) AND (i2 = 898732))
   Buffers: shared read=6
   ->  BitmapAnd  (cost=9.29..9.29 rows=1 width=0) (actual time=0.047..0.047 rows=0.00 loops=1)
         Buffers: shared hit=6
         ->  Bitmap Index Scan on btreeidx5  (cost=0.00..4.52 rows=11 width=0) (actual time=0.026..0.026 rows=7.00 loops=1)
               Index Cond: (i5 = 123451)
               Index Searches: 1
               Buffers: shared hit=3
         ->  Bitmap Index Scan on btreeidx2  (cost=0.00..4.52 rows=11 width=0) (actual time=0.007..0.007 rows=8.00 loops=1)
               Index Cond: (i2 = 898732)
               Index Searches: 1
               Buffers: shared hit=3
 Planning Time: 0.264 ms
 Execution Time: 0.047 ms
(15 rows)
</programlisting>
   Although this query runs much faster than with either of the single
   indexes, we pay a penalty in index size.  Each of the single-column
   btree indexes occupies 88.5 MB, so the total space needed is 531 MB,
   over three times the space used by the bloom index.
  </para>
 </sect2>

 <sect2 id="bloom-operator-class-interface">
  <title>Operator Class Interface</title>

  <para>
   An operator class for bloom indexes requires only a hash function for the
   indexed data type and an equality operator for searching. This example
   shows the operator class definition for the <type>text</type> data type:
  </para>

<programlisting>
CREATE OPERATOR CLASS text_ops
DEFAULT FOR TYPE text USING bloom AS
    OPERATOR    1   =(text, text),
    FUNCTION    1   hashtext(text);
</programlisting>
 </sect2>

 <sect2 id="bloom-limitations">
  <title>Limitations</title>
  <para>
   <itemizedlist>
    <listitem>
     <para>
      Only operator classes for <type>int4</type> and <type>text</type> are
      included with the module.
     </para>
    </listitem>

    <listitem>
     <para>
      Only the <literal>=</literal> operator is supported for search.  But
      it is possible to add support for arrays with union and intersection
      operations in the future.
     </para>
    </listitem>

    <listitem>
     <para>
       <literal>bloom</literal> access method doesn't support
       <literal>UNIQUE</literal> indexes.
     </para>
    </listitem>

    <listitem>
     <para>
       <literal>bloom</literal> access method doesn't support searching for
       <literal>NULL</literal> values.
     </para>
    </listitem>
   </itemizedlist>
  </para>
 </sect2>

 <sect2 id="bloom-authors">
  <title>Authors</title>

  <para>
   Teodor Sigaev <email>teodor@postgrespro.ru</email>,
   Postgres Professional, Moscow, Russia
  </para>

  <para>
   Alexander Korotkov <email>a.korotkov@postgrespro.ru</email>,
   Postgres Professional, Moscow, Russia
  </para>

  <para>
   Oleg Bartunov <email>obartunov@postgrespro.ru</email>,
   Postgres Professional, Moscow, Russia
  </para>
 </sect2>

</sect1>

Title: Bloom Index Limitations and Operator Class Interface
Summary
The bloom index access method has several limitations, including only supporting operator classes for int4 and text data types, only supporting the = operator for search, and not supporting UNIQUE indexes or searching for NULL values, while also providing an operator class interface for defining custom operator classes, such as the text_ops class for the text data type.