문제

Oracle에서 테이블 작업을 할 때 좋은 인덱스와 나쁜 인덱스를 설정하는 시점을 어떻게 알 수 있습니까?

도움이 되었습니까?

해결책

이는 '좋은'과 '나쁜'의 의미에 따라 다릅니다.기본적으로 추가하는 모든 인덱스는 해당 열을 기준으로 한 모든 검색의 성능을 향상시킨다는 점을 깨달아야 합니다(따라서 개인 테이블의 'lastname' 열에 인덱스를 추가하면 "where lastname = "이 포함된 쿼리의 성능이 향상됩니다). 전체 테이블에서 쓰기 성능이 저하됩니다.

그 이유는 행을 추가하거나 업데이트할 때 테이블 자체와 해당 행이 구성원으로 속한 모든 인덱스를 모두 추가하거나 업데이트해야 하기 때문입니다.따라서 테이블에 5개의 인덱스가 있는 경우 추가할 때마다 6개의 위치(5개의 인덱스와 테이블)에 기록해야 하며 업데이트는 최악의 경우 최대 6개의 위치에 영향을 미칠 수 있습니다.

인덱스 생성은 쿼리 속도와 쓰기 속도 간의 균형을 맞추는 작업입니다.야간 작업에서 일주일에 한 번만 데이터가 로드되지만 매일 수천 번 쿼리되는 데이터마트와 같은 일부 경우에는 인덱스를 오버로드하고 쿼리 속도를 최대한 높이는 것이 매우 합리적입니다.그러나 온라인 거래 처리 시스템의 경우에는 둘 사이의 균형을 찾으려고 합니다.

즉, 선택 쿼리에서 많이 사용되는 열에 인덱스를 추가하되 너무 많이 추가하지 말고 가장 많이 사용되는 열을 먼저 추가하세요.

그 후에는 생산 조건에서 성능이 어떻게 반응하는지 확인하기 위한 로드 테스트와 허용 가능한 균형을 찾기 위해 많은 조정이 필요합니다.

다른 팁

다양하고 매우 구체적이거나 고유한 필드가 좋은 인덱스가 됩니다.날짜 및 타임스탬프, 고유 증분 숫자(일반적으로 기본 키로 사용됨), 사람 이름, 자동차 번호판 번호 등...

반례는 성별입니다. 공통 값이 두 개뿐이므로 인덱스는 실제로 스캔해야 하는 행 수를 줄이는 데 도움이 되지 않습니다.

전체 길이의 설명이 포함된 자유 형식 문자열은 쿼리를 수행하는 사람이 문자열의 정확한 값을 거의 알지 못하므로 인덱스가 좋지 않습니다.

선형 순서의 데이터(예: 타임스탬프 또는 날짜)는 일반적으로 클러스터형 인덱스로 사용됩니다. 이는 행을 인덱스 순서로 저장하고 순서대로 액세스할 수 있도록 하여 범위 쿼리 속도를 크게 향상시킵니다(예:'10월부터 12월 사이의 판매 주문을 모두 주세요').이러한 경우 DB 엔진은 범위에 지정된 첫 번째 레코드를 찾아 마지막 레코드에 도달할 때까지 순차적으로 읽기 시작할 수 있습니다.

다음은 훌륭한 SQL Server 기사입니다.http://www.sql-server-performance.com/tips/optimizing_indexes_general_p1.aspx

비록 메커니즘이 Oracle에서는 작동하지 않지만 팁은 매우 적합합니다(클러스터형 인덱스의 경우 Oracle에서 동일한 방식으로 작동하지 않음).

@Infamous Cow -- 인덱스가 아닌 기본 키를 생각해야 합니다.

@xenph yan- 다른 사람들이 만지지 않은 것은 무엇을 선택하는 것입니다. 친절한 생성할 인덱스의 수입니다.일부 데이터베이스는 실제로 선택의 여지가 많지 않지만 일부는 매우 다양한 인덱스를 제공합니다.B-트리는 기본 그러나 항상 최고의 종류의 인덱스는 아닙니다.올바른 구조를 선택하는 것은 예상되는 용도의 종류에 따라 다릅니다.어떤 종류의 쿼리를 가장 많이 지원해야 합니까?대부분 읽기 환경에 있습니까, 아니면 주로 쓰기 환경에 있습니까?쓰기 작업이 업데이트나 추가에 의해 지배됩니까?기타 등등

다양한 유형의 인덱스와 그 장단점에 대한 설명은 다음에서 확인할 수 있습니다. http://20bits.com/2008/05/13/interview-questions-database-indexes/ .

특정 쿼리를 개선하려는 경우 몇 가지 경험 법칙입니다.

Oracle이 시작해야 한다고 생각되는 특정 테이블의 경우 WHERE 절에 사용된 각 열을 인덱싱해 보세요.같음이 있는 열을 먼저 배치한 다음 범위 등이 있는 열을 배치합니다.

예를 들어:

WHERE CompanyCode = ? AND Amount BETWEEN 100 AND 200

열의 크기가 매우 큰 경우(예:XML 등을 저장하고 있는 경우) 색인에서 제외하는 것이 더 나을 수도 있습니다.어쨌든 선택 목록을 만족시키기 위해 테이블 ​​행으로 이동해야 한다고 가정하면 스캔할 인덱스가 더 작아집니다.

또는 SELECT 및 WHERE 절의 모든 값이 인덱스에 있으면 Oracle은 테이블 행에 액세스할 필요가 없습니다.따라서 때로는 선택한 값을 인덱스의 마지막에 배치하고 테이블 액세스를 모두 피하는 것이 좋습니다.

색인을 작성하는 가장 좋은 방법에 관한 책을 쓸 수도 있습니다. 저자 Jonathan Lewis를 찾아보세요.

좋은 인덱스는 특정 테이블 행에 대해 고유하다고 믿을 수 있는 것입니다.

일반적으로 사용되는 인덱스 구성표 중 하나는 테이블의 각 행에 대해 1씩 증가하는 숫자를 사용하는 것입니다.모든 행은 결국 다른 숫자 인덱스를 갖게 됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top