2017-03-23 13 views
1

약간 혼란 스럽습니다. 나는 ORDER BY가 주어지지 않는다면, SELECT는 정렬을 위해 Clustered Index를 기본값으로 사용해야한다는 인상하에있었습니다.ORDER가없는 SELECT 클러스터 된 인덱스로 정렬하지 않음

그러나 아래를 실행하면 대신 NON-Clustered 인덱스가 사용됩니다.

그것은 아래로 결과
DROP TABLE TEST_TABLE 
if NOT EXISTS(select 1 from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'TEST_TABLE') 
BEGIN 
    CREATE TABLE TEST_TABLE (
     [ID] int  NOT NULL IDENTITY(1,1), 
     [col1] int  NOT NULL, 
     [col2] int  NOT NULL 

     CONSTRAINT [PK_TEST_TABLE] PRIMARY KEY CLUSTERED 
    (
     [ID] ASC 
    )WITH (FILLFACTOR = 90) ON [PRIMARY] 
    ) ON [PRIMARY] 
END 

IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[TEST_TABLE]') AND name = N'TEST_TABLE_cols') 
    DROP INDEX [TEST_TABLE_cols] ON [dbo].[TEST_TABLE] 

CREATE UNIQUE NONCLUSTERED INDEX [TEST_TABLE_cols] ON [dbo].[TEST_TABLE] 
(  [col1] ASC, 
     [col2] ASC  
)WITH (FILLFACTOR = 60) ON [PRIMARY]; 
GO 
--GO 

EXEC ('insert into test_table select 1, 0') 
EXEC ('insert into test_table select 2, 0') 
EXEC ('insert into test_table select 10, 0') 
EXEC ('insert into test_table select 9, 0') 
EXEC ('insert into test_table select 8, 0') 
EXEC ('insert into test_table select 6, 0') 
EXEC ('insert into test_table select 7, 0') 
EXEC ('insert into test_table select 5, 0') 
EXEC ('insert into test_table select 3, 0') 
EXEC ('insert into test_table select 4, 0') 

select * from test_table 

...

ID   col1  col2 
----------- ----------- ----------- 
1   1   0 
2   2   0 
9   3   0 
10   4   0 
8   5   0 
6   6   0 
7   7   0 
5   8   0 
4   9   0 
3   10   0 

사람이 설명 할 수있는 경우가 가장 극명하게 될 것이다!

+3

없음 'ORDER BY' , 주문 보증은 없습니다. 그것은 간단합니다. –

+3

글쎄, 그건 : '나는 ORDER BY가 주어지지 않는다면, SELECT는 Clustered Index to sorting에 기본값으로 설정되어야한다'라는 인상을 받고있다. 'ORDER BY'가 없으면 옵티마이 저는 순서대로 인덱스를 선택할 수 있습니다. – Lamak

+0

. 그 때 그것은 나의 오해였습니다. 신속한 피드백에 감사드립니다. – stubs

답변

5

ORDER BY가 지정되지 않은 경우 SELECT는 정렬을 위해 Clustered Index를 기본값으로 사용해야한다는 인상하에있었습니다.

사실상 (행이 단순한 스토리지를 순서대로 읽으면 얻을 수있는 것처럼) 실제로 나타날 수도 있지만 그 어디에도 보증이 없습니다. 쿼리 또는 쿼리 계획의 작은 변화로 인해 쉽게 변경 될 수 있습니다.

주문을 지정하지 않으면 결과에 순서가 없습니다.