F.7. 블룸 - 블룸 필터 배트맨 토토 액세스 방법#

블룸에 따라 배트맨 토토 액세스 방법을 제공합니다블룸 필터.

블룸 필터는 요소가 세트의 구성원인지 테스트하는 데 사용되는 공간 효율적인 데이터 구조입니다. 인덱스 액세스 방법의 경우 인덱스 생성에서 크기가 결정된 시그니처를 통해 일치하지 않는 튜플을 빠르게 제외 할 수 있습니다.

서명은 배트맨 토토 된 속성의 손실 된 표현이며, 따라서 잘못된 긍정을보고하기 쉽다. 즉, 요소가 세트에 있지 않은 것으로보고 될 수 있습니다. 따라서 배트맨 토토 검색 결과는 힙 항목의 실제 속성 값을 사용하여 항상 다시 확인해야합니다. 더 큰 서명은 잘못된 양의 확률을 줄이고 쓸모없는 힙 방문의 수를 줄이지 만 물론 지수를 더 크게 만들고 스캔이 느리게 만듭니다..

이 유형의 인덱스는 테이블에 많은 속성이 있고 쿼리 테스트 임의 조합을 테스트 할 때 가장 유용합니다. 기존의 BTREE 지수는 블룸 인덱스보다 빠르지 만 단일 블룸 인덱스 만 필요한 모든 가능한 쿼리를 지원하기 위해 많은 BTREE 인덱스가 필요할 수 있습니다. 그러나 Bloom Indexes는 평등 쿼리 만 지원하는 반면 Btree Indexes는 불평등 및 범위 검색을 수행 할 수 있습니다.

F.7.1. 매개 변수#

a블룸index는 다음 매개 변수를 수락합니다with절 :

길이

비트로 각 서명의 길이 (인덱스 항목). 가장 가까운 배수의로 반올림됩니다.16. 기본값은80비트 및 최대 값은4096.

col1 - col32

각 인덱스 열에 대해 생성 된 비트 수. 각 매개 변수의 이름은 제어하는 ​​인덱스 열의 수를 나타냅니다. 기본값은2비트 및 최대 값은4095. 실제로 사용되지 않은 배트맨 토토 열의 매개 변수는 무시됩니다.

F.7.2. 예#

이것은 블룸 색인 생성의 예입니다 :

bloom을 사용하여 tbloom에서 인덱스 BloomIdx 생성 (i1, i2, i3)
       (길이 = 80, col1 = 2, col2 = 2, col3 = 4);

인덱스는 80 비트의 시그니처 길이로 생성되며, I1 및 I2 속성은 2 비트에 매핑되었으며 I3은 4 비트에 매핑되었습니다. 우리는를 생략 할 수있었습니다.길이, col1col2기본값이 있기 때문에 사양.

다음은 Bloom Index 정의 및 사용에 대한보다 완전한 예와 동등한 BTREE 인덱스와 비교할 수 있습니다. Bloom Index는 Btree 지수보다 상당히 작으며 더 잘 수행 할 수 있습니다.

=# 테이블 TBLOOM 생성 AS
   선택하다
     (random () * 10000000) :: int as i1,
     (random () * 10000000) :: int as i2,
     (random () * 10000000) :: int as i3,
     (random () * 10000000) :: int as i4,
     (random () * 10000000) :: int as i5,
     (random () * 10000000) :: int as i6
   에서
  Generate_Series (1,10000000);
100000000 선택

이 큰 테이블을 순차적으로 스캔하는 데 시간이 오래 걸립니다 :

=# analyze analyze * 선택 * tbloom에서 i2 = 898732 및 i5 = 123451;
                                              쿼리 계획
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
 tbloom에서의 seq 스캔 (cost = 0.00..213744.00 행 = 250 너비 = 24) (실제 시간 = 357.059..357.059 행 = 0 루프 = 1)
   필터 : ((i2 = 898732) 및 (i5 = 123451))
   필터로 제거 된 행 : 100000000
 계획 시간 : 0.346ms
 실행 시간 : 357.076 ms
(5 줄)

BTREE 지수가 정의하더라도 결과는 여전히 순차적 인 스캔입니다.

=# tbloom에서 배트맨 토토 btreeIdx 생성 (i1, i2, i3, i4, i5, i6);
배트맨 토토를 만듭니다
=# select pg_size_pretty (pg_relation_size ( 'btreeidx'));
 pg_size_pretty
---------------
 386MB
(1 줄)
=# analyze analyze *에서 * tbloom에서 i2 = 898732 및 i5 = 123451;
                                              쿼리 계획
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
 tbloom에서의 seq 스캔 (비용 = 0.00..213744.00 행 = 2 너비 = 24) (실제 시간 = 351.016..351.017 행 = 0 루프 = 1)
   필터 : ((i2 = 898732) 및 (i5 = 123451))
   필터로 제거 된 행 : 100000000
 계획 시간 : 0.138ms
 실행 시간 : 351.035ms
(5 줄)

이 유형의 검색을 처리하는 데있어서 블룸 색인을 테이블에 정의하는 것보다 낫습니다.

=# bloom (i1, i2, i3, i4, i5, i6)을 사용하여 tbloom에서 인덱스 BloomIdx 생성;
인덱스를 만듭니다
=# select pg_size_pretty (pg_relation_size ( 'bloomidx'));
 pg_size_pretty
---------------
 153MB
(1 줄)
=# analyze analyze *에서 * tbloom에서 i2 = 898732 및 i5 = 123451;
                                                     쿼리 계획
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
 tbloom의 비트 맵 힙 스캔 (비용 = 1792.00..1799.69 행 = 2 너비 = 24) (실제 시간 = 22.605..22.606 행 = 0 루프 = 1)
   COND를 다시 확인하십시오 : ((i2 = 898732) 및 (i5 = 123451))
   인덱스 재전송으로 제거 된 행 : 2300
   힙 블록 : 정확한 = 2256
   - bloomidx에서 비트 맵 인덱스 스캔 (비용 = 0.00..178436.00 행 = 1 너비 = 0) (실제 시간 = 20.005..20.005 행 = 2300 루프 = 1)
         색인 조건 : ((i2 = 898732) 및 (i5 = 123451))
 계획 시간 : 0.099ms
 실행 시간 : 22.632ms
(8 줄)

이제 Btree 검색의 주요 문제는 검색 조건이 주요 인덱스 열을 제한하지 않을 때 Btree가 비효율적이라는 것입니다. Btree의 더 나은 전략은 각 열에서 별도의 인덱스를 만드는 것입니다. 그러면 플래너는 다음과 같은 것을 선택합니다.

=# tbloom (i1)에서 배트맨 토토 btreeidx1을 만듭니다.
배트맨 토토를 만듭니다
=# tbloom (i2)에서 배트맨 토토 btreeidx2 생성;
배트맨 토토를 만듭니다
=# tbloom (i3)에서 배트맨 토토 btreeidx3 생성;
배트맨 토토를 만듭니다
=# tbloom (i4)에서 배트맨 토토 btreeidx4 생성;
배트맨 토토를 만듭니다
=# tbloom (i5)에서 배트맨 토토 btreeidx5 생성;
배트맨 토토를 만듭니다
=# tbloom (i6)에서 배트맨 토토 btreeidx6을 만듭니다.
배트맨 토토를 만듭니다
=# analyze analyze *에서 * tbloom에서 i2 = 898732 및 i5 = 123451;
                                                        쿼리 계획
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
 tbloom의 비트 맵 힙 스캔 (비용 = 9.29..13.30 줄 = 1 너비 = 24) (실제 시간 = 0.032..0.033 행 = 0 루프 = 1)
   COND를 다시 확인하십시오 : ((i5 = 123451) 및 (i2 = 898732))
   - bitmapand (비용 = 9.29..9.29 행 = 1 너비 = 0) (실제 시간 = 0.047..0.047 행 = 0 루프 = 1)
         - btreeidx5의 비트 맵 배트맨 토토 스캔 (비용 = 0.00..4.52 행 = 11 너비 = 0) (실제 시간 = 0.026..0.026 행 = 7 루프 = 1)
               색인 조건 : (i5 = 123451)
         - btreeidx2의 비트 맵 배트맨 토토 스캔 (비용 = 0.00..4.52 행 = 11 너비 = 0) (실제 시간 = 0.007..0.007 행 = 8 루프 = 1)
               색인 조건 : (i2 = 898732)
 계획 시간 : 0.264ms
 실행 시간 : 0.047ms
(9 줄)

이 쿼리는 단일 색인 중 하나보다 훨씬 빠르지 만 인덱스 크기로 페널티를 지불합니다. 각 단일 열 Btree 지수는 88.5MB를 차지하므로 필요한 총 공간은 531MB이며 블룸 인덱스가 사용하는 공간의 3 배에 걸쳐

F.7.3. 연산자 클래스 인터페이스#

Bloom Indexes의 연산자 클래스에는 배트맨 토토 된 데이터 유형에 대한 해시 기능과 검색을위한 평등 연산자가 필요합니다. 이 예제는에 대한 연산자 클래스 정의를 보여줍니다.텍스트데이터 유형 :

운영자 클래스 생성 Text_ops
bloom as를 사용하여 유형 텍스트의 기본값
    연산자 1 = (텍스트, 텍스트),
    함수 1 해시 텍스트 (텍스트);

F.7.4. 제한#

  • 유일한 연산자 클래스int4and텍스트모듈에 포함되어 있습니다.

  • =운영자는 검색을 위해 지원됩니다. 그러나 향후 노조 및 교차로 운영으로 배열에 대한 지원을 추가 할 수 있습니다.

  • 블룸액세스 방법은 지원하지 않습니다고유 한배트맨 토토.

  • 블룸액세스 방법은 검색을 지원하지 않습니다NULL값.

F.7.5. 저자#

Teodor Sigaev, Postgres Professional, Moscow, 러시아

Alexander Korotkov, Postgres Professional, Moscow, 러시아

Oleg Bartunov, Postgres Professional, Moscow, 러시아

정정 제출

문서에 올바른 것이 없으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면