Oracle의 인덱스 구성 테이블을 사용해야 하는 경우아니면, 언제 하면 안 될까요?
인덱스 구성 테이블(IOT)은 인덱스 구조에 저장된 테이블입니다.힙에 저장된 테이블은 정리되지 않은 반면 IOT의 데이터는 기본 키(데이터는 인덱스)별로 저장 및 정렬됩니다.IOT는 "일반" 테이블과 동일하게 동작하며 사용자는 동일한 SQL을 사용하여 액세스합니다.
적절한 관계형 데이터베이스의 모든 테이블에는 기본 키가 있어야 합니다.데이터베이스의 모든 테이블에 기본 키가 있는 경우 항상 색인 구성 테이블을 사용해야 합니까?
내 생각에 대답은 '아니오'인 것 같은데, 색인 정리 표는 언제가 가장 좋은 선택이 아닐까요?
기본적으로 인덱스 구성 테이블은 테이블이 없는 인덱스입니다.USER_에서 찾을 수 있는 테이블 객체가 있습니다.TABLEs는 기본 지수에 대한 참조일 뿐이다.인덱스 구조가 테이블의 투영과 일치합니다.따라서 기본 키로 구성된 열과 최대 1개의 다른 열로 구성된 테이블이 있는 경우 INDEX ORPORATIONED에 대한 후보가 있을 수 있습니다.
인덱스 구성 테이블의 주요 사용 사례는 거의 항상 기본 키로 액세스되는 테이블이며 항상 모든 열을 가져오기를 원합니다.실제로 인덱스 구성 테이블은 참조 데이터, 코드 룩업 문제일 가능성이 높습니다.애플리케이션 테이블은 거의 항상 힙으로 구성됩니다.
이 구문을 사용하면 IOT에 여러 개의 키가 아닌 열을 포함할 수 있습니다.때로는 이것이 옳다.하지만 이는 설계 결정을 재고할 필요가 있음을 시사하는 것이기도 합니다.물론 기본 키 열이 아닌 열에 대한 추가 인덱스가 필요한 경우 일반 힙 테이블을 사용하는 것이 좋습니다.따라서 대부분의 테이블은 추가 인덱스를 필요로 하기 때문에 대부분의 테이블은 IOT에 적합하지 않습니다.
이 답변으로 돌아오면 이 스레드의 다른 응답 몇 개가 IOT에 적합한 후보로서 교차 테이블을 제안하고 있는 것을 알 수 있습니다.이는 교차 테이블이 후보 키와 일치하는 투영을 갖는 것이 일반적이기 때문에 타당해 보입니다.SUDENT_CLASSES는 (SUDENT_ID, CLASS_ID)의 투영을 가질 수 있습니다.
이건 주철이 아닌 것 같아요.교차로 테이블에는 종종 기술 키(예: STUENT_CLASS_ID)가 있습니다.또한 키가 아닌 열이 있을 수 있습니다(START_DATE, END_DATE 등의 메타데이터 열이 일반적입니다).또, 일반적인 액세스 패스는 없습니다.-학생이 수강하고 있는 모든 수업을 원하는 만큼 자주 수강하는 모든 학생을 찾고 싶기 때문에, 양쪽을 동등하게 서포트하는 색인화 전략이 필요합니다.교차로 테이블이 IOT의 사용 사례가 아니라고 말하는 것은 아닙니다. 단지 자동으로 그렇지 않을 뿐입니다.
매우 좁은 테이블(다대다 테이블을 해결하는 데 사용되는 조인 테이블 등)에 대해 고려할 수 있습니다.표의 모든 열이 인덱스에 포함되더라도 IOT를 사용하면 안 됩니다.
Richard Foote가 여기서 설명한 바와 같이 작은 테이블은 IOT에 적합한 후보입니다.
IOT에 적합한 표는 다음과 같습니다.
- "작은" 유형의 테이블(예: 자주 쿼리되고, 자주 업데이트되지 않으며, 비교적 적은 수의 블록에 적합함)
- 이미 모든 열을 포함하는 인덱스를 가질 테이블(즉, 인덱스가 데이터의 100%를 복제하는 경우 테이블에서 사용하는 공간을 절약할 수 있음)
Oracle Concepts 가이드:
인덱스 구성 테이블은 관련된 데이터를 함께 저장해야 하거나 데이터를 특정 순서로 물리적으로 저장해야 할 때 유용합니다.이러한 유형의 테이블은 정보 검색, 공간("Oracle Spatial 개요" 참조) 및 OLAP 애플리케이션("OLAP" 참조)에 자주 사용됩니다.
AskTom의 이 질문은 특히 누군가가 시나리오를 제시하고 IOT가 힙 정리된 표보다 더 나은 성능을 발휘하는지 묻는 경우에도 흥미로울 수 있습니다. Tom의 답변은 다음과 같습니다.
하루 종일 가설을 세울 수는 있지만 측정하기 전에는 확실히 알 수 없어요
일반적으로 인덱스로 구성된 테이블은 해당 테이블의 데이터에 키, 전체 키로만 액세스하고 키만 사용할 수 있는 것은 키뿐입니다.
또한 인덱스 구성 테이블에서 사용할 수 있는 기타 데이터베이스 기능과 사용할 수 없는 데이터베이스 기능에는 많은 제한이 있습니다. 적어도 하나의 버전에서는 인덱스 구성 테이블을 사용하여 논리 스탠바이 데이터베이스를 사용할 수 없었던 것으로 기억합니다.인덱스 구성 테이블로 인해 다른 기능을 사용할 수 없는 경우에는 이 테이블을 선택하는 것이 좋습니다.
IOT에서 실제로 절약되는 것은 테이블 세그먼트의 논리 읽기뿐입니다. IOT/인덱스에 2개 또는 3개 이상을 소비했을 수 있기 때문에 작은 데이터 세트를 제외하고 항상 큰 절약은 아닙니다.
특히 큰 테이블에서 검색 속도를 높이기 위해 고려해야 할 또 다른 기능은 단일 테이블 해시 클러스터입니다.올바르게 생성되면 데이터를 찾는 데 논리적인 읽기가 1개만 필요하기 때문에 IOT보다 대규모 데이터 세트에 더 효율적이지만 IOT는 리프 노드의 위치를 찾기 위해 여러 개의 논리 I/O가 필요한 인덱스입니다.
IOT에 대해서는 코멘트 자체는 할 수 없습니다만, 이것을 올바르게 읽고 있는 경우는, SQL Server 의 「클러스터 끝난 인덱스」와 같습니다.일반적으로 기본 키(또는 기본 키가 아닌 경우 인덱싱하는 값)가 랜덤하게 배포될 가능성이 높은 경우 이러한 인덱스를 사용하지 않는 것이 좋습니다. 이러한 삽입으로 인해 페이지가 많이 분할될 수 있기 때문입니다(비싸움).
ID 열(Oracle의 시퀀스) 및 날짜 '현재 날짜 전후'와 같은 인덱스는 이러한 인덱스에 적합한 후보가 되는 경향이 있습니다.
인덱스 구성 테이블은 일반 테이블과 달리 데이터를 구조화, 저장 및 인덱싱하는 고유한 방법이 있습니다.
인덱스 구성 테이블(IOT)은 다른 곳에 저장되고 실제 데이터에 대한 링크가 있는 인덱스와 달리 인덱스되는 데이터를 실제로 유지하는 인덱스입니다.
언급URL : https://stackoverflow.com/questions/3382939/when-should-i-use-oracles-index-organized-table-or-when-shouldnt-i
'source' 카테고리의 다른 글
| 동적 python 개체를 json으로 변환 (0) | 2023.03.18 |
|---|---|
| 스프링 부트에서의 스프링 관리 휴지 상태 인터셉터 사용 방법 (0) | 2023.03.18 |
| 초보자용 XSLT 레퍼런스 (0) | 2023.03.18 |
| logback.xml에서 스프링 속성 자리 표시자를 사용할 수 없습니다. (0) | 2023.03.18 |
| ng-repeat 및 limitTo를 사용하여 표시되는 항목 수 제한 (0) | 2023.03.18 |