4

프로덕션 환경에 데이터베이스 응용 프로그램이 있으며 모든 테이블은 현재 클러스터 된 인덱스로 설정된 GUID 기본 키를 사용합니다. 나는 이것이 성능 고려 사항 때문에 빈약 한 디자인이라는 것을 알고 있습니다. Kimberly Tripp의 this great article을 비롯한 많은 주제를 읽었습니다.GUID 기본 키, 별도의 클러스터 된 인덱스 열

INT의 자동 증가 인덱스 열을 간단히 만들고 클러스터 된 인덱스로 설정하여 성능을 향상시킬 수 있습니까? 필자는 Kimberly의 기사에서 클러스터되지 않은 모든 인덱스 (예 : 내 GUID 기본 키 등)가 클러스터 된 인덱스를 참조 함을 이해합니다. 그러나 WHERE 절에서 GUID 기본 키를 사용하여 레코드를 검색 할 경우 실제로 성능이 향상 될 것입니까?

또한 기존 레코드의 새 열을 자연스러운 순서로 채워서 성능을 향상시킬 수 있습니까?

편집 : 다른 질문 GUID 기본 키의 사용에 대한 일반에 대한 성능 고려 사항의 모범 사례에 대해 요구하고있다 :이 질문은 this other question의 중복 여부를 해결하기 위해. 특별한 접근법은 논의되지 않았다. 반면 내 질문은 자동 증가 인덱스 열 INT의 추가 여부가 GUID 기본 키의 문제를 개선하는 데 도움이되는지 묻는 것입니다. 더욱이, 나의 질문은 그 혜택을 실현하기 위해 자신의 "자연 질서"에 새로운 칼럼을 채워야 할지를 묻는다. 일반 수준이 높아서 다른 질문에서 다루지 않는다.

+0

예,보다 적합한 클러스터링 키 덕분에 조각화가 크게 감소하므로 성능이 향상됩니다. GUID는 고유 할 것이므로 항상 하나의 레코드 만 가져 오므로 추가 키 조회가 포함되어 있지만 시간이 지남에 따라 더 나은 조각 동작이 유용합니다. –

+0

[GUID를 사용하는 최상의 방법은 무엇입니까? 특히 성능과 관련하여 기본 키로 사용합니까?] (http : // stackoverflow.com/questions/11938044/what-are-the-the-the-best-practices-for-a-primary-key-specific-rega) – AHiggins

+0

@AHiggins - 내 편집을 참조하십시오. –

답변

3

는 몇 가지 고려 있습니다

  1. 예는, 클러스터 된 인덱스 키는 모든 클러스터되지 않은 인덱스에 존재하는 올바른 것입니다 것입니다. 작은 키를 사용하면 디스크 및 버퍼 풀의 공간 절약에 도움이됩니다.

  2. ID가 클러스터 된 키를 사용하면 테이블 삽입이 끝나고 잠재적으로 (로드에 따라) 삽입 핫스팟이 만들어집니다. 현재 GUIDS는 임의 삽입이며 핫스팟을 많이 제공하지 않지만 더 많은 페이지 분할을 유발하여 성능에 나쁜 영향을 줄 수 있습니다.

  3. 성능 향상에 대한 질문에 대답하려면 현재 문제 영역이 무엇입니까? 우리가 벗어날 수있는 데이터가 있습니까? 지금 당장 문제가 없으면 변경 사항을 적용하지 못할 수도 있습니다.

  4. 열을 ID로 추가 할 때 열은 자체 시드되어야하며 순서는 실제로 중요하지 않습니다.

  5. 키에 INT 열을 사용하는 경우 GUID 열에 고유 한 비 클러스터형 인덱스를 만들어 옵티마이 저가 단일 값 (최적화) 만 있고 빠른 탐색을 허용하도록합니다. 너무 비싸지 않으면 커버하도록하십시오.

+0

필자는 "핫스팟 삽입"이 빈번한 페이지 분할보다 성능 킬러가 훨씬 적다 고 주장 할 것입니다! 핫스팟은 6.5/7.0 릴리스에서 문제 였지만 실제로는 더 이상 알지 못합니다. 그러나 Page Splits는 극도로 비싸고 지저분한 업무입니다. 가능하다면 피해야합니다! –

+0

필자는 GUID 인덱스에 채우기 비율을 떨어 뜨리면 특히 큰 테이블에서 페이지 분할 문제를 어느 정도 해결할 수 있다는 것을 알게되었습니다. 채우기 비율을 떨어 뜨리면 페이지에 더 많은 공간이 예약되지만 인덱스가 커지기 시작합니다. 이러한 경우 클러스터 된 인덱스로 복합 자연 키를 만들 것을 제안합니다. 이것은 테이블을 자연 순서로 정렬합니다. – Namphibian

+0

@marc_s 삽입 핫스팟은 성능을 확실히 떨어 뜨릴 수있는 래치 경합을 일으 킵니다. 페이지 분할은 확실히 더 나쁘지 만 생각할 사항은 없습니다. SQLCAT에는 핫 스폿을 분할하는 분할 된 해시 테이블이 있지만 자체 문제가 있습니다. –