SQL服务器行不聚簇索引

问题描述:

的顺序我有对IDSQL服务器行不聚簇索引

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

当我做

select top 1000 * from some where date > '20150110' 

我的记录是不是为了一个聚集索引的表

当我这样做:

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'。如果您不使用它,则数据库可以按任意顺序自由返回行。 –

+0

当我添加第二个索引时,我绊倒了这个。另见http://stackoverflow.com/a/6936967/10245 –

如果您不指定一个订单,则不能依赖订单。添加order by子句。

否则,数据库将尽可能快地获取结果,并不总是按索引的顺序。

+0

我从来没有见过这种情况发生过。 我以为一个聚集索引存储和按键排序数据,在这种情况下是id。 http://msdn.microsoft.com/en-gb/library/ms190457.aspx 那么,你从数据库中选择的顺序自然会是它们的存储顺序? –

+0

@CharlesBryant存储的数据按聚簇索引排序,但是,如果数据库引擎决定并行执行查询,那么您会发生什么?你会有未排序的结果。 – dario

+0

此外,如果您的表有一些其他索引,SQL引擎可能会使用它们并按顺序返回数据 - 查看您的查询,您可能在日期字段上有索引,这可能不会在第一种情况下使用。像许多人已经注意到的那样 - 您必须始终使用ORDER BY。 – Arvo