SQLShack (한국어)
인덱스는 SQL Server에서 쿼리 프로세스의 속도를 높이는 데 사용됩니다. 공연. 교과서 색인과 유사합니다. 교과서에서 특정 장으로 이동해야하는 경우 색인으로 이동하여 해당 장의 페이지 번호를 찾아 해당 페이지로 직접 이동합니다. 색인이 없으면 원하는 장을 찾는 과정이 매우 느 렸을 것입니다.
데이터베이스의 색인에도 동일하게 적용됩니다. 인덱스가 없으면 DBMS는 원하는 결과를 검색하기 위해 테이블의 모든 레코드를 검색해야합니다. 이 프로세스를 테이블 스캔이라고하며 매우 느립니다. 반면에 인덱스를 만들면 데이터베이스는 먼저 해당 인덱스로 이동 한 다음 해당 테이블 레코드를 직접 검색합니다.
SQL Server에는 두 가지 유형의 인덱스가 있습니다.
- 클러스터형 인덱스
- 비 클러스터형 인덱스
클러스터형 인덱스
클러스터형 인덱스는 데이터가 테이블에 물리적으로 저장되는 순서를 정의합니다. 테이블 데이터는 유일한 방식으로 정렬 할 수 있으므로 테이블 당 클러스터형 인덱스는 하나만있을 수 있습니다. SQL Server에서 기본 키 제약 조건은 특정 열에 클러스터 된 인덱스를 자동으로 만듭니다.
살펴 보겠습니다. 먼저 다음 스크립트를 실행하여 “schooldb”내에 “student”테이블을 생성하거나 라이브 데이터를 사용하는 경우 데이터베이스가 완전히 백업되었는지 확인합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
데이터베이스 생성 schooldb
CREATE TABLE 학생
(
id INT PRIMARY KEY,
name VARCHAR (50) NOT NULL,
성별 VARCHAR (50) NOT NULL,
DOB datetime NOT NULL,
total_score INT NOT NULL,
city VARCHAR (50) NOT NULL
)
|
알림 여기 “학생”테이블에서 우리는 프리마를 설정했습니다 “id”열에 대한 ry 키 제약 조건입니다. 이렇게하면 “id”열에 클러스터형 인덱스가 자동으로 생성됩니다. 특정 테이블의 모든 인덱스를 보려면 “sp_helpindex”저장 프로 시저를 실행합니다. 이 저장 프로시 저는 테이블 이름을 매개 변수로 받아들이고 테이블의 모든 인덱스를 검색합니다. 다음 쿼리는 학생 테이블에 생성 된 색인을 검색합니다.
1
2
3
4
5
|
사용 schooldb
EXECUTE sp_helpindex student
|
위 쿼리는 다음 결과를 반환합니다.
index_name | index_description | index_keys |
PK__student__3213E83F7F60ED59 | PRIMARY에 위치한 클러스터링 된 고유 한 기본 키 | id |
출력에서 하나의 색인 만 볼 수 있습니다. “id”열에 대한 기본 키 제약 조건으로 인해 자동으로 생성 된 인덱스입니다.
이 클러스터형 인덱스 “id”의 오름차순으로 학생 테이블에 레코드를 저장합니다. 따라서 삽입 된 레코드의 ID가 5이면 첫 번째 행이 아닌 테이블의 5 번째 행에 레코드가 삽입됩니다. 마찬가지로 네 번째 레코드의 ID가 3이면 네 번째 행이 아닌 세 번째 행에 삽입됩니다. 이는 클러스터형 인덱스가 인덱싱 된 열, 즉 id에 따라 저장된 레코드의 물리적 순서를 유지해야하기 때문입니다. 이 순서가 작동하는 것을 보려면 다음 스크립트를 실행하십시오.
위 스크립트는 student 테이블에 10 개의 레코드를 삽입합니다. 여기서 레코드는 “id”열에있는 값의 임의 순서로 삽입되지만 id 열의 기본 클러스터형 인덱스로 인해 레코드는 “id”열에있는 값의 오름차순으로 물리적으로 저장됩니다. 다음 SELECT 문을 실행하여 학생 테이블에서 레코드를 검색합니다.
1
2
3
4
5
|
schooldb 사용
SELECT * FROM 학생
|
레코드는 다음 순서로 검색됩니다.
사용자 지정 클러스터형 인덱스 생성
기본 클러스터형 인덱스는 물론 사용자 지정 인덱스도 생성 할 수 있습니다. 테이블에 새 클러스터형 인덱스를 생성하려면 먼저 이전 인덱스를 삭제해야합니다.
색인을 삭제하려면 “개체 탐색기-> 데이터베이스-> Database_Name- 테이블-> Table_Name-> 인덱스”. 삭제하려는 인덱스를 마우스 오른쪽 버튼으로 클릭하고 삭제를 선택합니다. . 아래 스크린 샷을 참조하십시오.
이제, 새 클러스터형 인덱스를 생성하려면 다음 스크립트를 실행하십시오.
1
2
3
4
5
6
|
schooldb 사용
CREATE CLUSTERED INDEX IX_tblStudent_Gender_Score
ON student (gender ASC, total_score DESC)
|
cre의 과정 ating clustered index는 한 가지 예외를 제외하고 일반 인덱스와 유사합니다. 클러스터형 인덱스의 경우 “INDEX”앞에 “CLUSTERED”키워드를 사용해야합니다.
위 스크립트는 student 테이블에 “IX_tblStudent_Gender_Score”라는 클러스터형 인덱스를 생성합니다.이 인덱스는 “gender”및 “total_score”열에 생성됩니다. 둘 이상의 열에 생성 된 인덱스를 호출합니다. “복합 색인”.
위 색인은 먼저 모든 레코드를 성별 오름차순으로 정렬합니다. 두 개 이상의 레코드에 대해 성별이 동일한 경우 레코드는 “total_score”열에있는 값의 내림차순으로 정렬됩니다. 단일 열에도 클러스터형 인덱스를 생성 할 수 있습니다. 이제 모든 레코드를 선택하면 student 테이블에서는 다음 순서로 검색됩니다.
비 클러스터형 인덱스
비 클러스터형 인덱스는 테이블 내부의 물리적 데이터를 정렬하지 않습니다. 비 클러스터형 인덱스는 한 위치에 저장되고 테이블 데이터는 다른 위치에 저장됩니다. 이것은 책 내용이 한 위치에 있고 인덱스가 다른 위치에있는 교과서와 유사합니다. 따라서 둘 이상의 비 클러스터형이 가능합니다. 테이블 당 인덱스
여기서 언급하는 것은 테이블 내부에서 데이터가 클러스터형 인덱스로 정렬된다는 점을 언급하는 것이 중요합니다. 그러나 비 클러스터형 인덱스 데이터는 지정된 순서로 저장됩니다. 인덱스에는 인덱스가 생성 된 열 값과 열 값이 속한 레코드의 주소
인덱스가 생성 된 열에 대해 쿼리가 실행되면 데이터베이스는 먼저 인덱스로 이동하여 테이블에서 해당 행의 주소를 찾습니다. 그런 다음 해당 행 주소로 이동하여 다른 열 값을 가져옵니다. 이 추가 단계로 인해 비 클러스터형 인덱스가 클러스터형 인덱스보다 느립니다.
비 클러스터형 인덱스 생성
비 클러스터형 인덱스 생성 구문은 다음과 유사합니다. 클러스터형 인덱스입니다. 그러나 클러스터되지 않은 인덱스의 경우 “CLUSTERED”대신 “NONCLUSTERED”키워드가 사용됩니다. 다음 스크립트를 살펴보십시오.
1
2
3
4
5
6
|
schooldb 사용
NONCLUSTERED INDEX 만들기 IX_tblStudent_Name
ON student (name ASC)
|
위 스크립트는 student 테이블의 “name”열에 비 클러스터형 인덱스를 생성합니다. 인덱스는 이름별로 정렬됩니다. 앞서 말했듯이 테이블 데이터와 인덱스는 서로 다른 위치에 저장됩니다. 테이블 레코드는 클러스터형 인덱스가있는 경우 정렬됩니다. 인덱스는 정의에 따라 정렬되고 별도로 저장됩니다. 테이블에서.
학생 테이블 데이터 :
IX_tblStudent_Name 색인 데이터
이름 | 행 주소 |
Alan | 행 주소 |
Elis | 행 주소 |
Jolly | 행 주소 |
Jon | 행 주소 |
Joseph | 행 주소 |
Kate | 행 주소 |
Laura | 행 주소 |
마우스 | 행 주소 |
Sara | 행 주소 |
현명한 | 행 주소 |
알림 , 여기 색인에서 모든 행에는 이름이 속한 행의 주소를 저장하는 열이 있습니다. 따라서 “Jon”이라는 학생의 성별과 생년월일을 검색하는 쿼리가 실행되면 데이터베이스는 먼저 색인 내에서 “Jon”이라는 이름을 검색합니다. 그런 다음 “Jon”의 행 주소를 읽고 “student”테이블의 해당 행으로 직접 이동하여 Jon의 성별과 생년월일을 가져옵니다.
결론
토론에서 클러스터형 인덱스와 비 클러스터형 인덱스 사이에는 다음과 같은 차이점이 있습니다.
- 테이블 당 클러스터형 인덱스는 하나만있을 수 있습니다. 그러나 단일 테이블에 여러 비 클러스터형 인덱스를 만들 수 있습니다.
- 클러스터형 인덱스는 테이블 만 정렬합니다. 따라서 추가 스토리지를 사용하지 않습니다. 비 클러스터형 인덱스는 더 많은 저장 공간을 요구하는 실제 테이블과 별도의 위치에 저장됩니다.
- 클러스터형 인덱스는 추가 조회 단계가 필요하지 않기 때문에 비 클러스터형 인덱스보다 빠릅니다.
Ben의 기타 훌륭한 기사
SQL Server의 ID & 시퀀스의 차이점
SQL Server에서 클러스터형 인덱스와 비 클러스터형 인덱스의 차이점은 무엇입니까?
- 작성자
- 최근 게시물
Ben Richardson의 모든 게시물보기
- Power BI : 폭포 형 차트 및 결합 된 시각 자료-2021 년 1 월 19 일
- Power BI : 조건부 서식 및 데이터 색상 적용-2021 년 1 월 14 일
- Power BI : SQL Server 및 MySQL에서 데이터 가져 오기-2021 년 1 월 12 일
573,279 조회수
© 2021 Quest Software Inc. 모든 권리 보유. | GDPR | 이용 약관 | 개인 정보 보호