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...