| 젠 토토 : 문서 : 9.6 : 젠 토토 | |||
|---|---|---|---|
| PostgreSQL : 문서 : 9.6 : 사설 토토 사이트 | PostgreSQL : 문서 : 9.6 : 추가 제공 토토 사이트 추천 | 부록 F. 추가 제공 모듈 | 토토 결과 : 문서 : 9.6 : btree_gin |
블룸다음을 기반으로 하는 인덱스 액세스 방법을 제공합니다.블룸 필터.
블룸 필터는 요소가 집합의 구성원인지 여부를 테스트하는 데 사용되는 공간 효율적인 데이터 구조입니다. 인덱스 액세스 방법의 경우 인덱스 생성 시 크기가 결정되는 시그니처를 통해 일치하지 않는 튜플을 빠르게 제외할 수 있습니다.
서명은 색인된 속성의 손실 표현이므로 잘못된 긍정을 보고하는 경향이 있습니다. 즉, 집합에 포함되지 않은 요소가 포함되어 있다고 보고될 수 있습니다. 따라서 인덱스 검색 결과는 항상 힙 항목의 실제 속성 값을 사용하여 다시 확인해야 합니다. 서명이 클수록 거짓양성(false positive)의 가능성이 줄어들어 불필요한 힙 방문 횟수가 줄어들지만, 물론 인덱스도 커지므로 검색 속도가 느려집니다.
이 유형의 인덱스는 테이블에 많은 속성이 있고 쿼리가 이들의 임의 조합을 테스트할 때 가장 유용합니다. 전통적인 btree 인덱스는 블룸 인덱스보다 빠르지만 단일 블룸 인덱스만 필요한 경우 가능한 모든 쿼리를 지원하려면 많은 btree 인덱스가 필요할 수 있습니다. 그러나 블룸 인덱스는 동등 쿼리만 지원하는 반면, btree 인덱스는 불일치 및 범위 검색도 수행할 수 있습니다.
A 블룸색인은 다음 매개변수를 허용합니다.함께절:
각 서명(색인 항목)의 길이(비트). 가장 가까운 의 배수로 반올림됩니다.16. 기본값은80비트이며 최대값은4096.
각 인덱스 열에 대해 생성된 비트 수. 각 매개변수의 이름은 해당 매개변수가 제어하는 인덱스 열의 번호를 나타냅니다. 기본값은2비트, 최대값은4095. 실제로 사용되지 않는 인덱스 컬럼에 대한 매개변수는 무시됩니다.
이것은 블룸 인덱스 생성의 예입니다:
블룸(i1,i2,i3)을 사용하여 tbloom에서 인덱스 Bloomidx 생성
WITH (길이=80, 열1=2, 열2=2, 열3=4);
인덱스는 80비트의 서명 길이로 생성되며 속성 i1 및 i2는 2비트에 매핑되고 속성 i3은 4비트에 매핑됩니다. 우리는 생략할 수 있었습니다길이, col1및col2기본값이 있으므로 사양입니다.
다음은 블룸 인덱스 정의 및 사용법에 대한 더 완전한 예와 동등한 btree 인덱스와의 비교입니다. 블룸 인덱스는 btree 인덱스보다 상당히 작으며 더 나은 성능을 발휘할 수 있습니다.
=# CREATE TABLE t사설 토토 사이트 AS
선택
(random() * 1000000)::int를 i1로,
(random() * 1000000)::int를 i2로,
(random() * 1000000)::int를 i3으로,
(random() * 1000000)::int를 i4로,
(random() * 1000000)::int를 i5로,
(random() * 1000000)::int(i6)
에서
generate_series(1,10000000);
10000000을 선택하세요.
이 큰 테이블에 대한 순차적 스캔에는 시간이 오래 걸립니다.
=# 설명 분석 선택 * FROM t사설 토토 사이트 WHERE i2 = 898732 AND i5 = 123451;
설명 분석 선택 * FROM t사설 토토 사이트 WHERE i2 = 898732 AND i5 = 123451;
쿼리 계획
----------------------------------------------------------------------------
t사설 토토 사이트의 Seq 스캔(비용=0.00..2137.14 행=3 너비=24)(실제 시간=19.059..19.060 행=0 루프=1)
필터: ((i2 = 898732) AND (i5 = 123451))
필터에 의해 제거된 행: 100000
계획 시간: 0.269ms
실행 시간: 19.077ms
(5행)
btree 인덱스가 정의되어 있어도 결과는 여전히 순차 스캔입니다:
=# t사설 토토 사이트에서 btreeidx 인덱스 생성(i1, i2, i3, i4, i5, i6);
인덱스 생성
=# SELECT pg_size_pretty(pg_relation_size('btreeidx'));
pg_size_pretty
----------------
3992KB
(1줄)
=# 분석 선택 설명 * t사설 토토 사이트에서 i2 = 898732 AND i5 = 123451;
쿼리 계획
----------------------------------------------------------------------------
t사설 토토 사이트의 Seq 스캔(비용=0.00..2137.00 행=2 너비=24)(실제 시간=15.070..15.070 행=0 루프=1)
필터: ((i2 = 898732) AND (i5 = 123451))
필터에 의해 제거된 행: 100000
계획 시간: 0.130ms
실행 시간: 15.083ms
(5행)
테이블에 블룸 인덱스를 정의하는 것이 이러한 유형의 검색을 처리하는 데 btree보다 낫습니다.
=# Bloom(i1, i2, i3, i4, i5, i6)을 사용하여 tbloom에서 인덱스 Bloomidx를 생성합니다.
인덱스 생성
=# SELECT pg_size_pretty(pg_relation_size('bloomidx'));
pg_size_pretty
----------------
1584KB
(1줄)
=# 분석 선택 설명 * tbloom에서 i2 = 898732 AND i5 = 123451;
쿼리 계획
--------------------------------------------------------------------------------------------------------
tbloom의 비트맵 힙 스캔(비용=1792.00..1799.69 행=2 너비=24) (실제 시간=0.456..0.456 행=0 루프=1)
조건 다시 확인: ((i2 = 898732) AND (i5 = 123451))
인덱스 재검사로 제거된 행: 29
힙 블록: 정확한=27
- Bloomidx의 비트맵 인덱스 스캔(비용=0.00..1792.00 행=2 너비=0)(실제 시간=0.422..0.423 행=29 루프=1)
지수 조건: ((i2 = 898732) AND (i5 = 123451))
계획 시간: 0.105ms
실행 시간: 0.477ms
(8행)
이제, btree 검색의 주요 문제는 검색 조건이 선행 인덱스 열을 제한하지 않을 때 btree가 비효율적이라는 것입니다. btree에 대한 더 나은 전략은 각 열에 별도의 인덱스를 만드는 것입니다. 그런 다음 기획자는 다음과 같은 것을 선택합니다.
=# t사설 토토 사이트(i1)에서 인덱스 btreeidx1 생성;
인덱스 생성
=# t사설 토토 사이트(i2)에서 인덱스 btreeidx2 생성;
인덱스 생성
=# t사설 토토 사이트(i3)에서 인덱스 btreeidx3 생성;
인덱스 생성
=# t사설 토토 사이트(i4)에서 인덱스 btreeidx4 생성;
인덱스 생성
=# t사설 토토 사이트(i5)에서 인덱스 btreeidx5 생성;
인덱스 생성
=# t사설 토토 사이트(i6)에서 인덱스 btreeidx6 생성;
인덱스 생성
=# 분석 선택 설명 * t사설 토토 사이트에서 i2 = 898732 AND i5 = 123451;
쿼리 계획
-------------------------------------------------------------------------------------------------
t사설 토토 사이트의 비트맵 힙 스캔(비용=24.34..32.03 행=2 너비=24)(실제 시간=0.029..0.029 행=0 루프=1)
조건 다시 확인: ((i5 = 123451) AND (i2 = 898732))
- BitmapAnd(비용=24.34..24.34행=2너비=0)(실제 시간=0.028..0.028행=0루프=1)
- btreeidx5의 비트맵 인덱스 스캔(비용=0.00..12.04행=500 너비=0)(실제 시간=0.027..0.027행=0 루프=1)
지수 조건: (i5 = 123451)
- btreeidx2의 비트맵 인덱스 스캔(비용=0.00..12.04 행=500 너비=0)(실행되지 않음)
지수 조건: (i2 = 898732)
계획 시간: 0.389ms
실행 시간: 0.054ms
(9행)
이 쿼리는 단일 인덱스 중 하나를 사용할 때보다 훨씬 빠르게 실행되지만 인덱스 크기에 있어서 페널티를 지불합니다. 각 단일 열 btree 인덱스는 2MB를 차지하므로 필요한 총 공간은 블룸 인덱스에서 사용하는 공간의 8배인 12MB입니다.
블룸 색인용 연산자 클래스에는 색인된 데이터 유형에 대한 해시 함수와 검색에 대한 항등 연산자만 필요합니다. 이 예는에 대한 연산자 클래스 정의를 보여줍니다.텍스트데이터 유형:
연산자 클래스 생성 text_ops
Bloom AS를 사용하는 유형 텍스트의 기본값
연산자 1 =(텍스트, 텍스트),
기능 1 해시텍스트(텍스트);다음에 대한 연산자 클래스만int4그리고텍스트모듈에 포함되어 있습니다.
오직=연산자는 검색에 지원됩니다. 하지만 나중에 합집합 및 교차 연산이 포함된 배열에 대한 지원을 추가할 수 있습니다.
블룸액세스 방법이 지원되지 않음고유색인.
블룸액세스 방법은 검색을 지원하지 않습니다.NULL값.
테오도르 시가예프<teodor@postgrespro.ru, Postgres Professional, 러시아 모스크바
알렉산더 코로트코프<a.korotkov@postgrespro.ru, Postgres Professional, 러시아 모스크바
올렉 바르투노프<obartunov@postgrespro.ru, Postgres Professional, 러시아 모스크바