2011-12-23 41 views
5

我有一個包含PK聚簇索引以及其上的唯一索引和非唯一索引的表。如果我的問題(究竟):排序選擇的結果順序沒有或者ORDER BY子句

SELECT * FROM table_name 

SELECT col1, col2 FROM table_name 
將返回什麼命令行

這是客戶轉發給我們的面試問卷中的第一個問題。以下是說明:

如果此問題的答案不正確,請立即終止面試!個人,不管他們陳述的能力如何,都不瞭解基於SQL的關係數據庫管理系統。這是過去25年以上的SQL-101邏輯。正確的答案是:「未知/隨機/未確定,因爲沒有將ORDER BY子句指定爲查詢的一部分」。

我有點不相信這實際上是正確的。所有評論歡迎。

感謝,

拉吉

回答

8

即使表中有一個主鍵/聚集索引,你不能肯定行的順序。儘管在執行計劃中最後會有索引/堆掃描,但如果查詢在多個核心上並行執行,則由於並行流合併計劃步驟而不會對結果數據集進行排序。

您可能不會在小型數據庫上看到它,但請嘗試在單獨的硬盤驅動器上創建一個包含多個文件的文件並在多核機器上運行簡單查詢。最有可能的是,您會得到按ID進行「偏好排序」的結果 - 即,將存在排序行的塊,但塊將以半隨機順序進行檢索。

+1

+1此外,您可以在某些條件下獲得分配有序掃描,或者SQL Server可以使用高級掃描/旋轉掃描功能。 [也見這個答案](http://stackoverflow.com/questions/7116004/guarantee-order-of-table-valued-function-results/7117186#7117186) – 2011-12-24 11:13:52

5

這些指令在概念層面上講述SQL,查詢的結果是關係,關係是無序的。從概念到實際,在SQL標準中沒有定義隱式排序的原因是RDBMS可以自由地返回任何最有效的實現順序。