인덱스는 일반적으로 데이터베이스 성능을 향상시키는 데 사용됩니다. 그들 테이블 열 (또는 클래스 속성)에 정의되어야합니다. 반복 쿼리의 자격으로 사용됩니다. 부적절한 사용 업데이트 및 삽입 시간이므로 성능이 느려질 것입니다. 토토가있을 때 증가합니다.
인덱스는 테이블의 독창성을 시행하는 데 사용될 수 있습니다. 기본 키. 인덱스가 고유 한 다중 테이블 행으로 선언되면 동일한 인덱스 항목을 사용하면 허용되지 않습니다. 이 목적을 위해 목표는 성능을 향상시키지 않고 데이터 일관성을 보장하는 것입니다. 따라서 부적절한 사용에 대한 위의주의는 적용되지 않습니다.
두 가지 형태의 토토가 정의 될 수 있습니다.
a값 토토, 키 필드 인덱스의 경우 열 이름으로 지정됩니다. 여러 열 인덱스 액세스 방법이 지원되는 경우 지정할 수 있습니다 멀티 컬럼 인덱스.
a기능 색인, 인덱스입니다 하나 이상에 적용되는 함수의 결과에 정의 단일 클래스의 속성. 이것은 단일 열인 토토입니다 (즉, 함수 결과) 함수가 더 많이 사용하더라도 하나의 입력 필드보다. 기능 토토를 사용하여 얻을 수 있습니다 정상적으로 운영자를 기반으로 데이터에 대한 빠른 액세스 기본 데이터에 적용하려면 약간의 변환이 필요합니다.
Postgres는 btree, rtree 및 해시 액세스 방법을 제공합니다 토토. Btree 액세스 방법은 Lehman-Yao의 구현입니다 고음용 Btrees. RTREE 액세스 방법이 구현됩니다 Guttman의 2 차 분할 알고리즘을 사용하는 표준 rtree. 해시 액세스 방법은 Litwin의 선형 해싱을 구현 한 것입니다. 우리 전적으로 사용 된 알고리즘은 액세스 방법은 완전히 역동적이며 최적화 될 필요가 없습니다. 정기적으로 (예를 들어, 정적 해시 액세스와 마찬가지로 행동 양식).
thePostgres쿼리 최적화기 인덱스 속성이있을 때마다 btree 인덱스 사용을 고려합니다. 다음 중 하나를 사용하여 비교에 관여합니다. <, <=, =, =,
thePostgres쿼리 최적화기 인덱스 속성이있을 때마다 RTREE 인덱스 사용을 고려합니다. <<, & <, &, , @, ~ =, &&
thePostgres쿼리 최적화기 인덱스 속성이있을 때마다 해시 색인 사용을 고려합니다. 사용 비교에 관여=운영자.
현재 Btree 액세스 방법만이 멀티 컬럼을 지원합니다 인덱스. 기본적으로 최대 16 개의 키를 지정할 수 있습니다 (이 제한은 포스트 그레를 구축 할 때 변경 될 수 있습니다).
an운영자 클래스인덱스의 각 열. 운영자 클래스는 다음을 식별합니다 해당 열에 대한 인덱스에서 사용할 연산자. 예를 들어, a 4 바이트 정수의 Btree Index는를 사용합니다.int4_ops클래스; 이 운영자 클래스에는 포함됩니다 4 바이트 정수의 비교 기능. 실제로 필드 데이터 유형의 기본 연산자 클래스는 일반적으로입니다 충분한. 운영자 클래스를 갖는 주요 요점은 일부 데이터 유형에는 의미있는 순서가 둘 이상있을 수 있습니다. 예를 들어, 복잡한 수치 데이터 유형을 정렬 할 수 있습니다. 절대 가치 또는 실제 부분에 의해. 우리는 두 가지를 정의함으로써 이것을 할 수 있습니다 데이터 유형의 연산자 클래스를 사용한 다음 적절한 선택 색인을 만들 때 클래스. 일부 운영자 클래스도 있습니다 특별한 목적으로 :
운영자 클래스box_ops및bigbox_ops둘 다 RTREE 지수를 지원합니다 에서Box데이터 유형. 차이 그들 사이에bigbox_ops스케일 부동 소수점 예외를 피하기 위해 상자가 내려갑니다 매우 큰 곱하기, 추가 및 뺄셈을 수행합니다 부동 소수점 좌표. 당신의 필드 직사각형 거짓말은 약 20,000 단위 또는 더 큽니다. 사용해야bigbox_ops.
theint24_ops운영자 클래스입니다 INT2 데이터에 지수를 구성하고 수행하는 데 유용합니다 쿼리 자격에서 Int4 데이터와 비교. 비슷하게,int42_ops지원 지수 int2 데이터와 비교할 INT4 데이터에서 쿼리.
다음 쿼리는 모든 정의 된 연산자 클래스를 보여줍니다.
AM.AMNAME AS ACC_NAME을 선택하십시오. opc.opcname as ops_name, ops_comp로서 opr.oprname PG_AM AM, PG_AMOP AMOP에서 pg_opclass opc, pg_operator opr 여기서 amop.amopid = am.oid and amop.amopClaid = opc.oid 및 amop.amopop = opr.oid acc_name, ops_name, ops_comp의 주문
useDrop Indexan 색인.
저자 :작성자Herouth Maoz이것은 원래에 나타났습니다 질문에 대한 응답으로 1998-03-02의 사용자의 메일 링리스트. "기본 키와 고유의 차이점은 무엇입니까? 제약 조건? ".
제목 : Re : [질문] 기본 키 | 고유한 다음의 차이점은 무엇입니까? 기본 키 (필드, ...) 및 독특한 (들판, ...) - 이것은 별칭입니까? - 기본 키가 이미 고유 한 경우 그 이유는 이유가 있습니다 고유 한 또 다른 종류의 키가 있습니까?
기본 키는 특정 행을 식별하는 데 사용되는 필드입니다. 예를 들어, 사람을 식별하는 사회 보장 번호.
단순히 고유 한 필드 조합은 아무 관련이 없습니다. 행을 식별합니다. 그것은 단순히 무결성 제약입니다. 을 위한 예를 들어, 링크 컬렉션이 있습니다. 각 컬렉션이 식별됩니다 고유 한 숫자로 기본 키입니다. 이 키는 다음에 사용됩니다 처지.
그러나 내 응용 프로그램에는 각 컬렉션도 필요합니다 독특한 이름이 있습니다. 왜? 그래서 수정하고자하는 인간 컬렉션은이를 식별 할 수 있습니다. 알기가 훨씬 어렵습니다. "생명 과학"이라는 두 개의 컬렉션이 있다면 태그 24433은 필요한 것입니다. 아니다.
따라서 사용자는 이름으로 컬렉션을 선택합니다. 그러므로 우리 데이터베이스 내에서 이름이 고유한지 확인하십시오. 그러나 아니요 데이터베이스의 다른 테이블은 컬렉션 테이블과 관련이 있습니다. 수집 이름. 그것은 매우 비효율적입니다.
또한 고유 한 컬렉션 이름은 그렇지 않습니다 실제로 컬렉션을 정의하십시오! 예를 들어, 누군가가 결정했다면 컬렉션의 이름을 "생명 과학"에서 "생물학"으로 변경하십시오. 그것은 여전히 다른 이름으로 만 같은 컬렉션이 될 것입니다. 이름이 독특하다면 괜찮습니다.
SO :
기본 키 :
행을 식별하고 관련하여 사용됩니다.
업데이트가 불가능하거나 어렵습니다.
널 허용하지 않아야합니다.
고유 필드 (들) :
행에 대한 대체 액세스로 사용됩니다.
독특한 상태로 유지되는 한 업데이트 가능합니다.
널은 허용됩니다.
표준에서 비 유적 키가 명시 적으로 정의되지 않은 이유SQL구문? 글쎄, 당신은 이해해야합니다 그 토토는 구현 의존적입니다.SQL단지 구현을 정의하지 않습니다 데이터베이스의 데이터 사이의 관계.Postgres는 비 유적 토토를 허용하지만 시행에 사용되는 토토SQL키가 있습니다 항상 독특합니다.
따라서 열의 조합으로 테이블을 쿼리 할 수 있습니다. 이 열에 대한 색인이 없다는 사실에도 불구하고. 그만큼 인덱스는 단지 각각의 구현 원조 일뿐입니다.RDBMS일반적으로 사용하기 위해 제공합니다 보다 효율적으로 수행해야합니다. 일부RDBMS와 같은 추가 조치를 제공 할 수 있습니다 메인 메모리에 키를 저장합니다. 그들은 특별한 것을 가질 것입니다 예를 들어 명령
<pable 열 <cols에서 Memstore 만들기(이것은 기존 명령이 아니라 예제입니다).
실제로 기본 키 또는 고유 한 조합을 만들 때 필드의 어디에도SQL사양은 인덱스가 생성되었거나 키에 의한 데이터 검색은 순차적 스캔!
그래서, 그렇지 않은 필드 조합을 사용하려면 보조 키로 독특하면 실제로 지정할 필요가 없습니다. 무엇이든 - 그 조합으로 검색을 시작하십시오! 그러나 if 검색을 효율적으로 만들고 싶을 때 당신의 의미RDBMS제공자가 제공합니다 당신 - 그것은 색인, 나의 상상의 memstore 명령 또는 지능적인RDBMS보낸 사실에 근거한 지식이없는 토토 특정 키 조합을 기반으로 한 많은 쿼리 ... (It 경험에서 배웁니다).