2011-09-07 40 views
0

結果我在COL1主鍵聚集索引SQL-Server的2005:爲什麼以不同的順序返回與(NOLOCK)

爲什麼當我運行下面的語句是按不同的順序返回的結果

select * from table 

VS

select * from table with(nolock) 

的結果也與TABLOCK不同

模式:

col1 int not null 
col2 varchar (8000) 
+1

如果您沒有'ORDER BY'子句,您爲什麼期望某個訂單?實際上,您告訴SQL Server您並不關心訂單,因此可以自由選擇最理想的方式來返回數據(並且您需要假定這可以是*任意*順序,並且可以在執行之間進行更改)。 –

回答

4

沒有任何ORDER BY沒有保證結果順序。

您的問題現在被嚴重截斷,但原始版本提到您在使用nolock以及tablock時看到了不同的結果順序。

這兩個鎖定選項都允許SQL Server使用allocation order scan,而不是按邏輯順序沿着聚集索引數據頁(沿鏈接列表的指針)讀取。

這不應被視爲訂單被保證爲聚簇索引順序,而不是advanced scanning mechanism,或者例如並行度都可以改變這一點。

+0

+1有趣的文章! –

0

如果您未指定訂單,則完全不確定。今天他們可能會有所不同,明天可能不會。

提供提示可能會無意中引導查詢優化器降低效率。

3

除非您使用ORDER BY,否則不會保證行的順序。

如果必須按特定順序包含行,則沒有其他解決方案可按預定順序返回行。

如果你離開了順序由DBMS是免費的在它認爲是最有效的

1

SQL服務器不作任何順序保證任何順序返回行,它會改變基礎上的SQL Server如何優化查詢。

要保證訂單,您必須使用order by子句。

相關問題