select返回的記錄順序

2021-09-20 10:18:29 字數 3294 閱讀 9652

select返回記錄的順序對我們程式設計方式有較大影響,因此有必要明確select返回記錄的順序。

select返回記錄的順序與資料庫型別有很大關係,與索引情況也有很大關係,以下分類討論。

1.在oracle中

(1)如果select 後面的where條件中不含索引,oracle按rowid的大小順序來返回記錄。

因此 select * from mytable 與 select * from mytable order by rowid效果是一樣的

必須說明的是,並不是後插入記錄的rowid就越大。極有可能後插入的記錄rowid還要小。
因為在oracle中rowid由物件號,檔案號,塊,行號(塊內的行號)構成,

假設現在表中有三條記錄假設檔案號相同,按塊號,行號排列如下:

108 0

108 1

108 2

刪除中間一條記錄後,得到

108 0

108 2

再增加一條記錄,可能會得到

108 0

108 1 <—新增加的記錄

108 2

也可能是

108 0

108 2

108 3 <—新增加的記錄

兩種情況均有可能出現,取決於oracle當時分配演算法。

因此可以得出結論,在oracle中 select * from mytable不能保證返回的記錄順序是按插入的先後順序。
是按rowid順序返回的,rowid的順序與記錄行儲存的"物理序"一致,核心就是"物理序"。

在沒有索引情況下,select作全表掃瞄,是按"物理序",此時select 返回記錄按"物理序"最快。

(2)對於where後面有索引條件的時候

由於此時select按索引掃瞄表,因此返回記錄就按"索引序",所以在oracle中使用索引就可以

使返回的記錄得到排序,而無需再使用order by。對於不同的排序方式可以用不同的索引完成。

即時where後面沒有索引條件,也可按/+index(table index_name)/或/+index_desc(table index_name)/

強制使用索引以完成對錶的排序。

2.在sybase中

(1)對於sybase 執行計畫沒有帶索引的表的select

不管你的select 語句中是否在where後面使用了索引,sybase均可能基於代價對索引的使用

進行調整。

select * from mytable 按記錄的"物理序"返回記錄。

對於不帶簇索引的堆表,"物理序"就是插入記錄的先後順序。

對於帶簇索引的表,"物理序"就是簇索引欄位的排序。

(2)對於sybase 執行計畫帶索引的表的select

按索引欄位的順序返回記錄。

總結:由於sybase基於代價執行計畫會對索引的使用進行調整,因此不能像oracle那樣利用

非聚簇索引完成返回記錄的自然排序,這時最好加上order by以保證排序的準確。

如果需要排序的字段是聚簇索引,那麼就可以放心使用索引完成排序。這時,不論

執行計畫怎樣,sybase均按聚簇索引字段順序返回記錄。

對於不帶任何索引的裸表,也可以放心的使用select 完成自然排序,此時記錄按插入

的先後順序返回,這是sybase的乙個優點(當然是犧牲了空間和效率換來的),oracle無法做到。

對於堆表,sybase在空間管理中,記錄始終向資料頁鍊錶的最後一頁新增,即使中間頁存在空間

也不會被使用到。以保證插入順序與物理循序的一致性。

對於聚簇索引表,在插入資料時,會引起頁內部分記錄(值大的記錄)的移動,通過移動

sybase保證了資料的物理順序與聚簇索引順序一致。

3.在ms sql server中

(1)對於sql server 執行計畫沒有帶索引的表的select

不管你的select 語句中是否在where後面使用了索引,sql server均可能基於代價對索引的使用

進行調整。即使沒有where語句也有可能使用索引,即使有where語句也有可能不用索引。

對於sql server 執行計畫沒有帶索引的表的select

select * from mytable 按記錄的"物理序"返回記錄。

sql server空間分配是根據sysindexes中指出的表的索引分配對映表 (iam) 和檔案中的頁可用空間表(pfs)
來找到物件中可用的空閒空間。sql server隨機的(考慮平衡使用檔案,並優先使用未用完的擴充套件區)

將記錄插入到空閒頁中。在堆表中,即使刪除了記錄,該記錄所在頁不會作頁內移動。在簇索引表中,

刪除了記錄後,會按"影子記錄"方式對記錄進行頁內移動。

對於執行計畫沒有索引的記錄的掃瞄,記錄的"物理序"就是iam中使用的頁的順序,因此後插入的記錄可能先
掃瞄到。儘管記錄的儲存是隨機的,但是對於乙個靜態的表,連續兩次select返回的記錄的順序是一致的,

都是按"物理序"。對於乙個動態插入的表,如果select中給出了時間條件排出了當前插入的記錄,

則連續兩次返回的記錄的個數和順序也是一致的。

(2)對於sql server 執行計畫帶索引的表的select

按索引欄位的順序返回記錄。

(3)表的備份

基於3個前提:

不管你的select 語句中是否在where後面使用了索引,sql server均可能基於代價對索引的使用

進行調整。即使沒有where語句也有可能使用索引,即使有where語句也有可能不用索引。

不管你的delete 語句中是否在where後面使用了索引,sql server均可能基於代價對索引的使用

進行調整。即使沒有where語句也有可能使用索引,即使有where語句也有可能不用索引。

帶相同where語句的select 和 delete 執行計畫很可能不一樣。

因此select 和 delete 得到的記錄順序很可能不一致,如果要選取前n條記錄,那麼得到的記錄
集儘管條數一致但內容不一致。(儘管我們可以通過with(index(index_name))來強制select對索引

的使用,但delete卻不能夠強制指定索引,因為delete涉及對索引本身的刪除)

這種情況下,如果資料庫的性能夠好,要備份的資料不多,就不要使用set rowcount來控制條數。
但如果確需要控制一次刪除的條數,可以直接在where條件中控制更小的範圍,如時間範圍控制

到小時,一天的資料通過24小時的迴圈來備份。

要麼採用dts作備份。

select返回記錄的順序

select 返回記錄的 順序中興通訊重慶研究所游波吳育紅 select,順序,優化,備份,掃瞄,索引 當我們執行了 select語句,select返回的記錄的 順序對我們方式有較大影響,對記錄備份清除以及sql效能優化都有很大的關係。因此有必要明確 select 返回記錄的 順序。本文按資料庫分類...

select查詢語句執行順序

分類 oracle體系結構 好文要頂 關注我收藏該文 張冲andy 關注 34 粉絲 44 加關注0 0 oracle表空間維護總結 move降低高水位 hwm 收藏 重新整理頁面 返回頂部 登入 或 註冊,訪問 首頁。推薦 超50萬vc 原始碼 大型組態工控 電力 cad與gis原始碼庫!緬懷 傳...

select的使用方法記錄

服務端 select.cpp 定義控制台應用程式的入口點。include stdafx.h include include include pragma comment lib,ws2 32.lib define int server port 6002 define str server ip 1...