이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다PostgreSQL : 문서 : 17 : F.6. 블룸 - 블룸 필터 토토 핫 액세스 방법버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

F.6. 블룸 - 블룸 필터 롤 토토 액세스 방법#

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

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

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

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

F.6.1. 매개 변수#

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

길이

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

col1 - col32

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

F.6.2. 예#

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

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

인덱스는 80 비트의 시그니처 길이로 생성되며, I1 및 I2 속성은 2 비트에 매핑되었으며 4 비트에 매핑 된 속성 I3. 우리는를 생략 할 수있었습니다.길이, 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 스캔 (비용 = 0.00..213744.00 행 = 250 너비 = 24) (실제 시간 = 357.059..357.059 행 = 0.00 루프 = 1)
   필터 : ((i2 = 898732) 및 (i5 = 123451))
   필터로 제거 된 행 : 100000000
   버퍼 : 공유 적중 = 63744
 계획 시간 : 0.346ms
 실행 시간 : 357.076 ms
(6 줄)

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 스캔 (cost = 0.00..213744.00 행 = 2 너비 = 24) (실제 시간 = 351.016..351.017 행 = 0.00 루프 = 1)
   필터 : ((i2 = 898732) 및 (i5 = 123451))
   필터로 제거 된 행 : 100000000
   버퍼 : 공유 적중 = 63744
 계획 시간 : 0.138ms
 실행 시간 : 351.035ms
(6 줄)

테이블에 블룸 색인이 정의되는 것은이 유형의 검색을 처리 할 때 btree보다 낫습니다.

=# 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.00 루프 = 1)
   COND를 다시 확인하십시오 : ((i2 = 898732) 및 (i5 = 123451))
   인덱스 재전송으로 제거 된 행 : 2300
   힙 블록 : 정확한 = 2256
   버퍼 : 공유 적중 = 21864
   - bloomidx에서 비트 맵 인덱스 스캔 (비용 = 0.00..178436.00 행 = 1 너비 = 0) (실제 시간 = 20.005..20.005 행 = 2300.00 루프 = 1)
         색인 조건 : ((i2 = 898732) 및 (i5 = 123451))
         색인 검색 : 1
         버퍼 : 공유 히트 = 19608
 계획 시간 : 0.099ms
 실행 시간 : 22.632ms
(11 줄)

이제 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.00 루프 = 1)
   COND를 다시 확인하십시오 : ((i5 = 123451) 및 (i2 = 898732))
   버퍼 : 공유 읽기 = 6
   - bitmapand (비용 = 9.29..9.29 행 = 1 너비 = 0) (실제 시간 = 0.047..0.047 행 = 0.00 루프 = 1)
         버퍼 : 공유 적중 = 6
         - BTREEIDX5의 비트 맵 롤 토토 스캔 (비용 = 0.00..4.52 행 = 11 너비 = 0) (실제 시간 = 0.026..0.026 행 = 7.00 루프 = 1)
               색인 조건 : (i5 = 123451)
               색인 검색 : 1
               버퍼 : 공유 적중 = 3
         - btreeidx2의 비트 맵 롤 토토 스캔 (비용 = 0.00..4.52 행 = 11 너비 = 0) (실제 시간 = 0.007..0.007 행 = 8.00 루프 = 1)
               색인 조건 : (i2 = 898732)
               색인 검색 : 1
               버퍼 : 공유 적중 = 3
 계획 시간 : 0.264ms
 실행 시간 : 0.047ms
(15 줄)

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

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

Bloom Indexes의 연산자 클래스에는 롤 토토 된 데이터 유형에 대한 해시 기능 만 필요합니다. 이 예제는에 대한 연산자 클래스 정의를 보여줍니다.텍스트데이터 유형 :

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

F.6.4. 제한#

  • int4and텍스트모듈에 포함되어 있습니다.

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

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

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

F.6.5. 저자#

Teodor Sigaev, Postgres Professional, Moscow, Russia

Alexander Korotkov, Postgres Professional, Moscow, 러시아

Oleg Bartunov, Postgres Professional, Moscow, 러시아