結果我在COL1主鍵聚集索引SQL-Server的2005:爲什麼以不同的順序返回與(NOLOCK)
爲什麼當我運行下面的語句是按不同的順序返回的結果
select * from table
VS
select * from table with(nolock)
的結果也與TABLOCK不同
模式:
col1 int not null
col2 varchar (8000)
結果我在COL1主鍵聚集索引SQL-Server的2005:爲什麼以不同的順序返回與(NOLOCK)
爲什麼當我運行下面的語句是按不同的順序返回的結果
select * from table
VS
select * from table with(nolock)
的結果也與TABLOCK不同
模式:
col1 int not null
col2 varchar (8000)
沒有任何ORDER BY
沒有保證結果順序。
您的問題現在被嚴重截斷,但原始版本提到您在使用nolock
以及tablock
時看到了不同的結果順序。
這兩個鎖定選項都允許SQL Server使用allocation order scan,而不是按邏輯順序沿着聚集索引數據頁(沿鏈接列表的指針)讀取。
這不應被視爲訂單被保證爲聚簇索引順序,而不是advanced scanning mechanism,或者例如並行度都可以改變這一點。
+1有趣的文章! –
如果您未指定訂單,則完全不確定。今天他們可能會有所不同,明天可能不會。
提供提示可能會無意中引導查詢優化器降低效率。
除非您使用ORDER BY
,否則不會保證行的順序。
如果必須按特定順序包含行,則沒有其他解決方案可按預定順序返回行。
如果你離開了順序由DBMS是免費的在它認爲是最有效的
SQL服務器不作任何順序保證任何順序返回行,它會改變基礎上的SQL Server如何優化查詢。
要保證訂單,您必須使用order by子句。
如果您沒有'ORDER BY'子句,您爲什麼期望某個訂單?實際上,您告訴SQL Server您並不關心訂單,因此可以自由選擇最理想的方式來返回數據(並且您需要假定這可以是*任意*順序,並且可以在執行之間進行更改)。 –