약간 혼란 스럽습니다. 나는 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
사람이 설명 할 수있는 경우가 가장 극명하게 될 것이다!
없음 'ORDER BY' , 주문 보증은 없습니다. 그것은 간단합니다. –
글쎄, 그건 : '나는 ORDER BY가 주어지지 않는다면, SELECT는 Clustered Index to sorting에 기본값으로 설정되어야한다'라는 인상을 받고있다. 'ORDER BY'가 없으면 옵티마이 저는 순서대로 인덱스를 선택할 수 있습니다. – Lamak
. 그 때 그것은 나의 오해였습니다. 신속한 피드백에 감사드립니다. – stubs