programing

데이터베이스의 테이블 열에 색인을 작성할 시기를 결정하시겠습니까?

showcode 2023. 3. 26. 11:55
반응형

데이터베이스의 테이블 열에 색인을 작성할 시기를 결정하시겠습니까?

난 DB가 아니야하지만 테이블을 만들고 CRUD 작업을 수행해야 합니다.기본적으로 모든 열에 인덱스를 생성해야 할지 말아야 할지 헷갈립니다.인덱스를 작성하면서 생각한 것은 다음과 같습니다.

인덱스는 기본적으로 메모리 위치 범위(첫 번째 값이 저장되는 시작 메모리 위치부터 마지막 값이 저장되는 끝 메모리 위치까지)를 포함합니다.따라서 테이블 인덱스에 컬럼의 값을 삽입할 때 컬럼 값이 하나 더 있기 때문에 업데이트해야 하지만 컬럼 값의 업데이트는 인덱스 값에 영향을 미치지 않습니다.그렇죠? 즉, 두 테이블 간의 결합에서 내 컬럼을 사용할 경우 결합에서 사용되는 컬럼에 인덱스를 작성하는 것을 고려해야 하지만 다른 컬럼에 인덱스를 작성하는 경우 새로운 값이 컬럼에 삽입될 때 인덱스 값을 갱신하는 추가 비용이 발생하기 때문에 다른 컬럼은 모두 건너뛸 수 있습니다.그렇죠?

「」의 「」를 해 주세요.테이블에서mytable에는 두 의 세 의 열: 세 개의 열)이 .col1 ,col2 ,col3

select col1,col2 from mytable

이제 두 가지 사례가 있습니다..col1 ★★★★★★★★★★★★★★★★★」col2두 번째 경우에는 인덱스를 생성하지 않습니다.** 제가 이해한 바로는 케이스1은 케이스2보다 빠릅니다.케이스1은 컬럼 메모리 위치를 빠르게 찾을 수 있기 때문입니다.여기서는 조인 열을 사용하지 않았지만 인덱스가 도움이 됩니다.여기서 인덱스를 작성해야 하나요, 말아야 하나요?

위의 시나리오와 같은 상황에서 우리가 발사한다면?

select * from mytable

대신

select col1,col2 from mytable

인덱스가 도움이 될까요?

모든 열에 인덱스를 만들지 마십시오!삽입/삭제/갱신 조작의 속도가 느려집니다.

위해, 에 수 있습니다.WHERE,ORDER BY ★★★★★★★★★★★★★★★★★」GROUP BY절을 참조하십시오. 위해 하는 것을 (a를 ).JOIN를 들어) (예:)

예:

SELECT col1,col2,col3 FROM my_table WHERE col2=1

여기서 col2에 인덱스를 작성하면 이 쿼리에 많은 도움이 됩니다.

또한 인덱스 선택성도 고려하십시오.간단히 말해서, "큰 도메인"을 가진 값에 대한 인덱스를 만듭니다.ID, 이름 등남성/여성 열에 생성하지 마십시오.

단, 컬럼 값 업데이트는 인덱스 값에 영향을 주지 않습니다.그렇죠?

아니요. 인덱스된 열을 업데이트하면 영향을 미칩니다.Oracle 11g 성능 설명서에는 다음과 같이 명시되어 있습니다.

인덱스된 열을 수정하는 UPDATE 문과 인덱스된 테이블을 수정하는 INSERT 및 DELETE 문에는 인덱스가 없는 경우보다 시간이 더 오래 걸립니다.이러한 SQL 문은 인덱스의 데이터와 테이블의 데이터를 수정해야 합니다.또한 실행 취소 및 재실행도 추가로 만듭니다.


즉, 두 테이블 간의 결합에서 내 컬럼을 사용할 경우 결합에서 사용되는 컬럼에 인덱스를 작성하는 것을 고려해야 하지만 다른 컬럼에 인덱스를 작성할 경우 컬럼에 새 값이 삽입될 때 인덱스 값을 업데이트해야 하는 추가 비용이 발생하기 때문에 다른 컬럼은 모두 건너뛸 수 있습니다.그렇죠?

삽입뿐만 아니라 다른 모든 데이터 조작 언어 문도 포함합니다.

이 시나리오를 고려해 보십시오.색인이 도움이 될까요?

이 마지막 단락과 관련하여, 인덱스해야 할 열에 대한 가정을 증명하거나 반증할 수 있도록 대표적인 데이터 볼륨으로 테스트 케이스를 구축해 보는 것은 어떨까요?

특정 시나리오에서는 WHERE 절이 없기 때문에 테이블스캔 또는 인덱스스캔이 사용되지만 하나의 컬럼만 드롭되므로 퍼포먼스는 크게 다르지 않을 수 있습니다.두 번째 시나리오에서는 인덱스는 커버되지 않고 WHERE 조항이 없기 때문에 사용해서는 안 된다.WHERE 절이 있는 경우 인덱스를 통해 누락된 열을 얻기 위해 조회해야 하는 행 수를 줄일 수 있습니다.

Oracle에는 힙 또는 인덱스 구성 테이블을 비롯한 여러 다른 테이블이 있습니다.

지수가 커버하는 경우에는 특히 선택적인 경우에 사용될 가능성이 높다.그러나 WHERE 절에 제약이 있고 커버링 인덱스의 열이 기본 테이블보다 훨씬 적은 경우에는 인덱스 구성 테이블이 힙의 커버링 인덱스보다 낫지 않습니다.

실제로 사용되는 것보다 더 많은 열이 있는 인덱스를 만들면 인덱스가 커버될 가능성이 높은 경우에만 도움이 되지만 모든 열을 추가하는 것은 인덱스 구성 표와 비슷합니다.Oracle은 SQL Server의 INCLUDE(COLUMN)와 동등한 기능을 가지고 있지 않습니다.이것에 의해, 인덱스를 보다 포괄적으로 작성할 수 있습니다(열 서브셋만으로 cluster화된 인덱스를 효과적으로 작성할 수 있습니다).인덱스를 일의로 하고 싶지는 않지만 고유성으로 간주하고 싶지 않은 데이터를 추가하는 경우에 편리합니다.더 많은 질문을 할 수 있도록 하기 위해)

계획을 살펴보고 인덱스가 도움이 되는지 확인해야 합니다.그리고 나서 설계도를 보고 차이가 있는지 알아보세요.

언급URL : https://stackoverflow.com/questions/7744038/decision-when-to-create-index-on-table-column-in-database

반응형