OLTP 시스템에서 GUID를 키 및 클러스터로 잘못 사용하는 것은 아무 문제가 없습니다 (클러스터의 크기가 커지는 테이블에 많은 인덱스가없는 경우 제외). 실제로 IDENTITY 열보다 확장 성이 훨씬 뛰어납니다.
GUID가 SQL Server에서 큰 문제라고 널리 퍼져 있습니다. 대체로 이것은 잘못된 것입니다. 실제로 GUID는 약 8 개 이상의 코어가있는 박스에서 훨씬 확장 성이 뛰어납니다.
죄송하지만 개발자가 옳습니다. GUID에 대해 걱정하기 전에 다른 것들에 대해 걱정하십시오.
아, 그리고 마지막으로 : 왜 클러스터 인덱스를 먼저 원하십니까? 작은 인덱스가 많은 OLTP 시스템이 우려되는 경우 힙을 사용하는 것이 좋습니다.
이제 GUID가 소개 할 조각화가 읽은 내용에 대해 고려해 보겠습니다. 조각화에는 세 가지 주요 문제가 있습니다.
- 페이지 분할 비용 디스크 I / O
- 전체 페이지 절반은 전체 페이지만큼 메모리 효율적이지 않습니다
- 페이지가 순서대로 저장되지 않으므로 순차적 I / O 가능성이 줄어 듭니다.
이 문제에 대한 우려는 확장성에 관한 것이므로 "하드웨어를 더 추가하면 시스템 속도가 빨라진다"고 정의 할 수 있습니다. 차례로 하나씩 해결하기 위해
광고 1) 규모를 원한다면 I / O를 구매할 여유가 있습니다. 저렴한 삼성 / 인텔 512GB SSD (USD / GB)는 100K IOPS 이상을 제공합니다. 당신은 2 소켓 시스템에서 곧 그것을 소비하지 않을 것입니다. 그리고 당신이 그것에 부딪 치면, 하나 더 사면 설정됩니다
광고 2) 당신이 당신의 테이블에서 삭제하면, 당신은 어쨌든 전체 페이지 절반이됩니다. 그렇지 않은 경우에도 메모리는 저렴하고 가장 큰 OLTP 시스템을 제외하고는 모두 핫 데이터가 적합해야합니다. 더 많은 데이터를 페이지에 넣는 것은 스케일을 찾을 때 하위 최적화입니다.
Ad 3) 페이지 분할 빈도가 높고 조각난 데이터로 구성된 테이블은 순차적으로 채워진 테이블과 동일한 속도로 임의 I / O를 수행합니다.
조인과 관련하여 워크로드와 같은 OLTP에서 볼 수있는 두 가지 주요 조인 유형은 해시 및 루프입니다. 각각을 차례로 살펴 보자.
해시 조인 : 해시 조인은 작은 테이블이 검색되고 더 큰 테이블이 일반적으로 검색된다고 가정합니다. 작은 테이블은 메모리에있을 가능성이 높으므로 여기서 I / O는 걱정하지 않아도됩니다. 우리는 이미 추구하는 것이 조각화되지 않은 인덱스와 같은 조각화 된 인덱스의 비용이라는 사실에 대해 이미 언급했습니다.
루프 조인 : 외부 테이블을 찾습니다. 같은 비용
잘못된 테이블 스캔이 많이 발생할 수도 있지만 GUID는 다시 걱정할 필요가 없으며 적절한 인덱싱입니다.
이제 합법적 인 범위 스캔이 진행될 수 있으며 (특히 외래 키에 참여할 때) 조각화 된 데이터가 조각화되지 않은 데이터와 비교하여 덜 "포장 된"것입니다. 그러나 3NF 데이터가 잘 색인화되어있는 조인은 다음과 같습니다.
참조하는 테이블의 기본 키에 대한 외래 키 참조가있는 테이블의 조인
다른 방법으로
광고 1)이 경우 기본 키에 대한 단일 탐색-n에 1을 결합)-조각화 여부와 동일한 비용 (1 회 탐색)
광고 2)이 경우 동일한 키에 참여하고 있지만 둘 이상의 행을 검색 할 수 있습니다 (범위 탐색). 이 경우 조인은 1에서 n입니다. 그러나 당신이 찾고있는 외래 테이블, 당신은 SAME 키를 찾고 있습니다.이 키는 조각화되지 않은 것과 같은 페이지에있을 가능성이 높습니다.
외래 키를 잠시 고려하십시오. 기본 키를 "완벽하게"순차적으로 배치 했더라도 해당 키를 가리키는 것은 순차적이지 않습니다.
물론 돈이 저렴하고 프로세스가 많은 일부 은행의 SAN에있는 가상 머신에서 실행 중일 수 있습니다. 그러면이 모든 조언을 잃게됩니다. 그러나 그것이 당신의 세계라면, 확장 성은 아마도 당신이 찾고있는 것이 아닐 것입니다-당신은 성능과 빠른 속도 / 비용을 찾고 있습니다.