728x90
SELECT절 MAX함수에 하나의 컬럼을 넣어서 최대 값을 구하게 되는데 컬럼 2개를 더하여 MAX값을 구하는 경우가 있다. 이럴 경우 실행계획에서 인덱스를 사용할 수 있을까?
1.테이블 생성
CREATE TABLE [dbo].[MAX_TEST]
(
[No] [char](14) NOT NULL,
[YMD] [char](8) NULL,
[HMS] [char](6) NULL,
[TAG] [varchar](6) NULL,
CONSTRAINT [PK_MAX_TEST] PRIMARY KEY CLUSTERED([No] ASC)
)
GO
2.인덱스 생성
CREATE NONCLUSTERED INDEX [IX_MAX_TEST_TAG_YMD_HMS] ON [dbo].[MAX_TEST]
(
[TAG] ASC,
[YMD] ASC,
[HMS] ASC
)
GO
3.데이터 삽입 및 확인
10개의 데이터를 삽입한다.
--데이터 삽입
SET NOCOUNT ON;
DECLARE @i INT = 1
WHILE @i <= 10
BEGIN
insert into MAX_TEST values(@i,'20230101'+@i,'150101'+@i,@i+1) SET @i += 1
END
--데이터 확인
select * From MAX_TEST
쿼리실행 및 실행계획
SELECT TOP 1 max(Ymd + Hms) as 'MAX_YMD+HMS '
FROM MAX_TEST with (nolock)
WHERE tag = '5'
실행계획을 보면 생성해둔 인덱스(IX_MAX_TEST_TAG_YMD_HMS)를 타는 것을 볼 수 있다.
위의 내용으로 이해가 가지 않는다면 아래의 테스트를 추가로 확인해보자.
테스트를 위한 추가인덱스를 생성
CREATE NONCLUSTERED INDEX [IX_MAX_TEST_TAG_YMD] ON [dbo].[MAX_TEST]
(
[TAG] ASC,
[YMD] ASC
)
GO
쿼리를 실행해보자
Hms가 없는 인덱스를 사용하였을 경우랑 비교해서 비용을 확인해보자.
SELECT TOP 10 max(Ymd+Hms) as 'MAX_YMD+HMS'
FROM MAX_TEST with (index(IX_MAX_TEST_TAG_YMD))
WHERE tag = '5'
GO
SELECT TOP 10 max(Ymd+Hms) as 'MAX_YMD+HMS'
FROM MAX_TEST
WHERE tag = '5'
GO
실행계획을 보면 IX_MAX_TEST_TAG_YMD 인덱스를 사용한 경우 Hms 값을 인덱스에서 찾을 수 없기 때문에 Hms값을 찾기 위해 KEY LOOKUP 계획이 추가된 것을 볼 수 있다.
이렇게 SELECT절에 +를 사용해서 문자열을 더하면 인덱스 사용이 가능한 것으로 보인다. 하지만 int 형은 테스트를 안해봐서 모르겠다. 이상으로 MAX함수 SELECT절 가공 시 인덱스를 사용여부 테스트를 마친다.
반응형
그리드형
'IT > MSSQL' 카테고리의 다른 글
[MSSQL] 복사전용백업(COPY ONLY BACKUP) 실행방법 및 개념설명 (1) | 2023.11.18 |
---|---|
[MSSQL] 대규모 테이블 insert시 락 방지를 위해 분할하여 넣는 방법 (0) | 2023.08.13 |
[MSSQL] SELECT 쿼리 복사 후 자동 정렬(SSMS 개행문자 옵션 설정) (0) | 2023.08.13 |
[MSSQL] 프로시저(SP) 생성시간 및 수정시간 확인방법 (0) | 2023.08.13 |
[MSSQL]프로파일러 쿼리 사용법 예시 (0) | 2023.04.15 |
댓글