2015-01-15 2 views
1

의 순서로 나는 SQL 서버 행은하지 클러스터 된 인덱스

내 기록

select top 1000 * from some where date > '20150110' 
순서에없는 수행 ID

[SomeID] [bigint] IDENTITY(1,1) NOT NULL, 

에 클러스터 된 인덱스가있는 테이블이

내가 할 때 :

select top 1000 * from some where date > '20150110' and date < '20150111' 

순서가 맞습니까?

지수입니다 : 내가 전에이 건너 적이없는

CONSTRAINT [PK_Some] PRIMARY KEY CLUSTERED 
(
    [SomeID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

, 사람이 무슨 일이 일어나고 있는지의 아이디어가 않고, 나는이 문제를 해결할 수있는 방법.

감사합니다.

+3

결과의 특정 순서를 보장하는 유일한 방법 (실제로 *** 유일한 ***)은'ORDER BY'를 사용하는 것입니다. DB를 사용하지 않으면 임의의 순서로 행을 반환 할 수 있습니다. –

+0

두 번째 인덱스를 추가 할 때이 부분이 넘어졌습니다. 또한보십시오 http://stackoverflow.com/a/6936967/10245 –

답변

1

지정하지 않으면 주문을 신뢰할 수 없습니다. order by 절을 추가하십시오.

그렇지 않으면 DB는 가능한 한 빨리 결과를 얻지 만 항상 색인의 순서는 아닙니다.

+0

나는 이것을 전에 결코 보지 않았다 것은. 클러스터 된 인덱스는 키 (이 경우 ID)에 의해 데이터를 저장하고 정렬한다고 생각했습니다. http://msdn.microsoft.com/en-gb/library/ms190457.aspx 당연히 db에서 선택하는 순서는 저장된 순서 일 것입니다. –

+0

@CharlesBryant 저장된 데이터는 클러스터 된 인덱스로 정렬되지만 데이터베이스 엔진이 쿼리 실행을 병렬화하기로 결정한 경우 어떻게 될 것이라고 생각하십니까? 정렬되지 않은 결과가 표시됩니다. – dario

+0

또한 테이블에 다른 인덱스가있는 경우 SQL 엔진에서 이러한 인덱스를 사용하여 순서대로 데이터를 반환 할 수 있습니다. 쿼리를 보면 첫 번째 경우에는 사용되지 않을 가능성이있는 인덱스가 날짜 필드에있을 수 있습니다. 이미 많은 사람들이 언급 한 것처럼 항상 ORDER BY를 사용해야합니다. – Arvo

관련 문제