2015-01-15 139 views
1

的順序我有對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 –

回答

1

如果您不指定一個訂單,則不能依賴訂單。添加order by子句。

否則,數據庫將盡可能快地獲取結果,並不總是按索引的順序。

+0

我從來沒有見過這種情況發生過。 我以爲一個聚集索引存儲和按鍵排序數據,在這種情況下是id。 http://msdn.microsoft.com/en-gb/library/ms190457.aspx 那麼,你從數據庫中選擇的順序自然會是它們的存儲順序? –

+0

@CharlesBryant存儲的數據按聚簇索引排序,但是,如果數據庫引擎決定並行執行查詢,那麼您會發生什麼?你會有未排序的結果。 – dario

+0

此外,如果您的表有一些其他索引,SQL引擎可能會使用它們並按順序返回數據 - 查看您的查詢,您可能在日期字段上有索引,這可能不會在第一種情況下使用。像許多人已經注意到的那樣 - 您必須始終使用ORDER BY。 – Arvo

相關問題