클러스터
-영어 사전의 알파벳 순서로 구성된 인덱스.
-유일한 키(primary key)로 구성된 컬럼
-트리 구조로 인덱스 생성.
-비클러스터 형보도 검색 속도가 빠름.
-입력/수정/삭제가 느림.
-테이블에 한개만 생성이 가능.
-두 열에 인덱스 구성시 클러스터 형을 사용 할 수 없음.
비클러스터
-유일한 키.
-별도의 장소에 인덱스 페이지를 생성하고 별도로 생성된 인덱스에서 해당 주소를 검색해여 조회.
-입력/수정/삭제가 빠름.
-테이블에 여러개 생성이 가능.
단순 비클러스터
-단순은 중복을 허용한다는 의미로, 고유와 반대의미 임.
포괄 열이 있는 인덱스
포괄 열이 있는 인덱스(Index with Included Columns)란 비클러스터형 인덱스의 리프 페이지에 데이터를 포함하고 있는 열을 의미한다.
포괄 열이 있는 열을 의미한다. 포괄 열이 있는 인덱스를 활용하면 쿼리 성능을 높일 수 있다.
포괄 열에 없는 컬럼을 조회할 때는 테이블 스캔을 하게된다.
*인덱스의 최대 크기는 900byte를 넘을 수 없다. 포괄열이 있는 인덱스는 900byte가 넘어도 입력이 됨.
-포괄 열이 있는 인덱스는 비클러스터형 인덱스에만 생성할 수 있다.
-포괄 열이 있는 인덱스는 인덱스의 크기가 커지는 단점이 있다.
-포괄 열이 있는 인덱스 생성 후에, 일부 SELECT 문의 성능이 급격히 향상될 수 있다.
-포괄 열이 있는 인덱스가 있더라도 SELECT의 열이 그 포괄 열에 포함되지 않으면, 어차피 인덱스는 사용되지 않는다.
-인덱스를 만들 열은 총 합이 900바이트를 넘지 않아야 한다. 그럴 경우에는 포괄 열이 있는 인덱스를 만들어서 해결할 수 있다.
-포괄 열이 있는 인덱스 생성 후에, INSERT/UPDATE/DELETE 문은 더 늦어질 수 있다. 데이터를 중복해서 입력해야 되기 때문이다.
필터링된 인덱스
인덱스를 생성하는 해당 열의 전체 데이터에 대해서 인덱스를 생성하는 것이 아니라, 특정 조건에 맞는 데이터로만 인덱스를 생성하는 것을 말한다.
이렇게 필터링된 인덱스를 이용하면 인덱스의 크기가 줄어들어 인덱스 관리의 부담을 덜 수 있다.(특히대용량 데이터의 경우에 효과적이다).
-NULL 값이 대부분인 열에 인덱스를 생성할 때
-데이터가 있더라도 특정 범위로만 검색할 경우
-경우에 따라서는 '인덱싱된 뷰' 대신에 사용하는 것이 관리 비용이 절감될 수 있다.
-포괄 열이 있는 인덱스에도 필터링될 범위를 지정하는 것이 관리에 효율적이다.
---------------------------------------------------------------------------------------------------------------
클러스터 인덱스의 생성
ALTER TABLE [테이블명]
ADD CONSTRAINT [인덱스명] PRIMARY KEY ([인덱스 컬럼])
->alter table USER_TBL_INDEXT
add constraint PK_userno primary key (user_no)
CREATE INDEX [인덱스명]ON [테이블명] ([컬럼명])
->create index idx_usernm
on USER_TBL_INDEXT (user_deptcd)
비클러스터 인덱스 생성
CREATE NONCLUSTERED INDEX [인덱스명] ON [테이블명] ([컬럼명], [컬럼명])
두 열에 인덱스 생성. 두열에 인덱스 생성 할 때는 클러스터 형으로 구성을 할 수 없다(두 열이 조건에 있을 때만 사용됨).
create nonclustered index idx_company_idx_user_nm on USER_TBL_INDEXT (company, user_nm)
인덱스 제거
DROP INDEX [테이블명].[인덱스명]
Primary Key 제약조건이나 Unique 제약 조건으로 자동 생성된 인덱스는 제거 할 수 없다.
drop index USER_TBL_INDEXT.idx_USER_TBL_INDEXT_COMPANY_USER_NO
포괄 열이 있는 인덱스
CREATE NONCLUSTERED INDEX [인덱스명] ON [테이블명]([컬럼명]) INCLUDE ([컬럼명], [컬럼명])
CREATE NONCLUSTERED INDEX idx_cust_include
ON Cust_Include(CustomerID)
INCLUDE (AccountNumber, TerritoryID)
필터링된 인덱스
CREATE NONCLUSTERED INDEX [인덱스명] ON[테이블명]([컬럼명]) WHERE [컬럼명] IS NOT NULL
CREATE NONCLUSTERED INDEX idx_filter
ON filterIndexTbl (addressLine2)
WHERE addressLine2 IS NOT NULL
인덱스가 걸리는 조건
WHERE 절 왼쪽 컬럼을 가공을 하면 인덱스가 걸리지 않는다.
예)where substring(date, 1, 4) = '2007' X
where date = '2007' O
<>, NOT IN, NOT EXISTS
부정형 연산자를 사용해도 인덱스가 걸리지 않는다.
묵시적 형변환
데이터 타입이 다르면 인덱스를 타지 않는다.
예) where subject = 1 <- 문자타입의 데이터에 숫자를 대입했기 때문에 subject의 숫자형 형 변환이 일어난다.
LIKE
LIKE 검색도 인덱스가 적용될때와 적용되지 않을 때가 있다.
WHERE content LIKE '텍스트%' <-인덱스 적용됨.
WHERE content LIKE '%텍스트%' <- 인덱스 적용안됨.
WHERE, HAVING
WHERE은 인덱스가 적용되지만, HAVING은 인덱스가 적용되지 않는다.
'MS-SQL' 카테고리의 다른 글
동적 pivot (0) | 2016.10.05 |
---|---|
XML 문서 쿼리로 조회하기 (0) | 2015.08.12 |
CTE Table (0) | 2015.07.29 |
WHERE 조건에 case문으로 사용 컬럼 바꾸기 (0) | 2015.07.29 |
CASE WHEN END (0) | 2015.07.29 |
댓글