CREATE TABLE dbo.AA (
id INT NOT NULL,
VARCHAR(10) NOT 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