LiveLock vs. DeadLock 위치로그  |  태그  |  미디어로그  |  방명록
icon SELECT시 클러스터형 인덱스를 사용해도, ORDER BY를 반드시 사용할 것!
Development/SQL | 2009/05/05 23:02
MS SQL Server Books Online (온라인 설명서)에서,
Clustered indexes(클러스터형 인덱스)를 검색해 보면 아래와 같은 설명을 볼 수 있다.

영문: "An index on the columns specified in the ORDER BY or GROUP BY clause may remove the need for the Database Engine to sort the data, because the rows are already sorted. This improves query performance."
한글: "ORDER BY 또는 GROUP BY 절에 지정된 열에서 인덱스를 만들면 행이 이미 정렬되어 있기 때문에 데이터베이스 엔진이 데이터를 정렬할 필요가 없습니다. 따라서 쿼리 성능도 향상됩니다."

BOL의 설명이 조금 애매한데, 이에 대해 'Clustered index를 만들면 행이 이미 정렬되어 ORDER BY를 사용하지 않아도 된다'라고 잘못 해석할 수도 있을 것 같다.

실제로, 다음과 같은 예제를 실행해 보면 SELECT시 클러스터형 인덱스를 사용하면,
굳이 ORDER BY를 생략해도 될 것 같다는 착각을 준다.
-----------------------------------------------------------------
CREATE TABLE dbo.AA (
id INT  NOT NULL,
 VARCHAR(10NOT NULL
)
GO
DECLARE @I INT
SET @I = 1
WHILE @I < 1000
BEGIN
  INSERT INTO dbo.AA VALUES( @I, CONVERT( VARCHAR(10), @I ) )
  SET @I = @I + 1
END
GO
CREATE CLUSTERED INDEX CX_AA_id ON dbo.AA(id)
--DROP INDEX CX_AA_id ON dbo.AA
--TRUNCATE TABLE dbo.AA
GO

SELECT * FROM dbo.AA
SELECT * FROM dbo.AA ORDER BY id
GO

-----------------------------------------------------------------
실행 계획 비교:
위 실행 계획과 같이, ORDER BY를 안 써도 똑같이 수행되기 때문에 ORDER BY가 필요없다고 생각할 수 있다.

그러나, 아래의 예제로 실행해 보면 실행 계획이 다르며, 따라서 ORDER BY를 사용하지 않으면 정렬되지 않은 데이터를 얻는다.
(출처의 예제 소스를 위와 비교하기 위해 변형하였다.)
-----------------------------------------------------------------
CREATE TABLE dbo.order_by (
 id int identity(1,1) PRIMARY KEY CLUSTERED
 , some_field VARCHAR(10)
)

DECLARE @I INT
SET @I = 1
WHILE @I < 1000
BEGIN
  INSERT INTO dbo.order_by (some_field) VALUES ( CONVERT( VARCHAR(10), @I ) )
  SET @I = @I + 1
END
GO

CREATE NONCLUSTERED INDEX ni_order_by_some_field ON dbo.order_by (some_field ASC)

SELECT * FROM dbo.order_by
SELECT * FROM dbo.order_by ORDER BY id


-----------------------------------------------------------------
실행 결과(위 SELECT에 대해 TOP 5로 Query를 수행하였다.): ORDER BY를 안 쓰니, 정렬되지 않았다!

실행 계획: 2개가 서로 다르다.

이와 같은 경우가 있을 수 있기 때문에, 절대로
'Clustered index를 만들면 데이터가 물리적으로 정렬되므로 order by를 사용하지 않아도 정렬된 데이터를 얻을 수 있다'
라는 착각을 하면 안된다!

이 점에 대해 다소 의아하게 생각할 수 있는데,
SQL Server는 RDBMS이고 ORDER BY를 명시하지 않은 SELECT 결과에 대해서는
정렬되지 않은 결과를 SQL Server에서 준다고 하여도, SQL Server는 정상적으로 작동한 것이라고 할 수 있기에..
Clustered index를 만들었기에 ORDER BY를 쓰지 않는 실수를 해서는 안된다.

조금 더 자세하게 살펴보고자 한다면, 관련 출처 및 출처에 기재된 URL을 참고..
 - http://social.technet.microsoft.com/Forums/ko-KR/transactsql/thread/97fdcd34-dfb7-45fb-b495-89b24a8dc16d



arrow 태그 : , , , , , , ,
arrow 트랙백0 | 댓글0
이 글의 관련글(트랙백) 주소 :: http://livelock.tistory.com/trackback/4 관련글 쓰기

아이디 :
비밀번호 :
홈페이지 :
  비밀글로 등록
내용 :
 



[PREV] [1] ... [7][8][9][10][11][12][13][14][15] ... [26] [NEXT]
관리자  |   글쓰기
BLOG main image
부족하지만 남고 싶기도 한 어느 Developer였던 사람의 블로그입니다. (다시 돌아올지도..)
분류 전체보기 (26)
Digital Devices (4)
Development (8)
Server Management (3)
Culture (6)
FreeTalk (0)
Etc. (3)
Articles (2)
Total : 3,852
Today : 1
Yesterday : 4
rss
위치로그 : 태그 : 방명록 : 관리자
Lock's Blog is powered by Daum / Designed by plyfly.net