본문 바로가기
IT/MSSQL

[MSSQL] MAX함수 SELECT절 가공 시 인덱스를 사용할까?

by 베베야 2023. 8. 13.
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절 가공 시 인덱스를 사용여부 테스트를 마친다.

반응형
그리드형

댓글