저의 SQL (Server 2008)에 대한 저수준 지식은 제한적이며 이제 DBA가 문제를 해결하고 있습니다. 시나리오를 설명해 드리겠습니다 (내가 옳다는 희망으로 명백한 진술을 언급했지만 잘못된 것을 발견하면 알려주세요).
사람들을위한 '법원 명령'을 보관하는 테이블이 있습니다. (이름 : CourtOrder) 테이블을 만들 때 다음과 같이 만들었습니다.
CREATE TABLE dbo.CourtOrder
(
CourtOrderID INT NOT NULL IDENTITY(1,1), (Primary Key)
PersonId INT NOT NULL,
+ around 20 other fields of different types.
)
그런 다음 효율성을 위해 클러스터되지 않은 인덱스를 기본 키에 적용했습니다. 내 이유는 이것이 고유 한 필드 (기본 키)이고 주로 선택 목적으로 인덱싱되어야하기 때문입니다.Select from table where primary key = ...
그런 다음 PersonId에 CLUSTERED 인덱스를 적용했습니다. 그 이유는 대부분의 작업이 한 사람에 대한 주문을 받고 있기 때문에 특정 사람에 대한 주문을 물리적으로 그룹화하기 때문입니다. 그래서,select from mytable where personId = ...
나는 지금 이것에 대해 뽑혔다. 클러스터형 인덱스는 기본 키에, 일반 인덱스는 personId에 배치해야한다고 들었습니다. 그것은 나에게 매우 이상하게 보입니다. 우선, 고유 한 열에 클러스터형 인덱스를 배치하는 이유는 무엇입니까? 클러스터링이란 무엇입니까? 확실히 클러스터형 인덱스의 낭비입니까? 고유 한 열에 일반 인덱스가 사용된다고 믿었을 것입니다. 또한 인덱스 클러스터링은 다른 열을 클러스터링 할 수 없음을 의미합니다 (테이블 당 하나, 맞습니까?).
내가 실수했다는 이유는 PersonId에 클러스터형 인덱스를 넣으면 삽입 속도가 느려질 것이라고 믿기 때문입니다. 선택 속도가 5 % 증가하면 삽입 및 업데이트 속도가 95 % 저하됩니다. 정확하고 유효합니까?
personId를 클러스터링하기 때문에 SQL Server는 PersonId를 삽입하거나 변경할 때마다 데이터를 재 배열해야한다고 말합니다.
그래서 나는 왜 그렇게 느리다면 SQL이 CLUSTERED INDEX의 개념을 가질까요? 그들이 말하는 것만 큼 느린가요? 최적의 성능을 얻으려면 인덱스를 어떻게 설정해야합니까? SELECT가 INSERT보다 더 많이 사용된다고 생각했지만 INSERTS에 잠금 문제가 있다고 말합니다.
누군가 나를 도울 수 있기를 바랍니다.