select
返回記錄的
順序中興通訊重慶研究所游波吳育紅
select,
順序,優化,備份,掃瞄,索引
當我們執行了
select語句,
select返回的記錄的
順序對我們方式有較大影響,對記錄備份清除以及sql效能優化都有很大的關係。因此有必要明確
select
返回記錄的
順序。本文按資料庫分類討論oracle/sybase/sqlserver
返回記錄的
順序,從原理**三種資料庫各自的特點,並著重**了這些差異對資料查詢及記錄備份的影響。
縮略語:
iam:indexallocationmap
pfs:pagefreespace
1.簡介
當我們執行了
select語句,
select返回的記錄的
順序對我們程式設計方式有較大影響,對資料庫記錄備份清除以及sql效能優化都有很大的關係。因此有必要明確
select
返回記錄的
順序。select
返回記錄的
順序與資料庫型別有很大關係,因此以下按資料庫型別分別討論。本文主要討論了oracle/sybase/sqlserver
返回記錄的
順序,從原理**三種資料庫各自的特點,並著重**了這些差異對資料查詢及記錄備份的影響。
2.oracle
以下假設資料庫查詢優化方式均為基於rule的方式,oracle採用兩種訪問表中記錄的方式:
a.全表掃瞄(fulltablescan)
全表掃瞄就是
順序地訪問表中每條記錄.oracle採用一次讀入多個資料塊(databaseblock)的方式優化全表掃瞄。
b.通過rowid訪問表
你可以採用基於rowid的訪問方式情況,提高訪問表的效率,rowid包含了表中記錄的物理位置資訊。oracle採用索引(index)實現了資料和存放資料的物理位置(rowid)之間的聯絡。通常索引提供了快速訪問rowid的方法,因此那些基於索引列的查詢就可以得到效能上的提高。通常表現為按索引掃瞄。(indexscan)
2.1全表掃瞄
如果select語句不能使用索引,則按全表掃瞄方式讀取資料塊,對於返回的結果集,oracle按rowid的大小
順序來返回記錄。因此
select*frommytable與
select*frommytableorderbyrowid效果是一樣的
可以通過
selectrowidfromtable得到rowid偽列,資料型別為rowid型別。使用查詢語句返回的是rowid的擴充套件格式(extendedrowid)。擴充套件格式的rowid由18個字元組成。這18個字元可以按照oooooo.fff.bbbbbb.sss的格式分為4組。分別代表資料物件編號(dataobjectnumber),資料檔案編號(datafilenumber),資料塊編號(datablocknumber),記錄或記錄片斷的塊內行號。
必須說明的是,並不是後插入記錄的rowid就越大,有可能後插入的記錄rowid還要小。下面給出兩個論點加以證明:
1.後插入的記錄塊內行號可能大,也可能小
根據我們的試驗,假設現在表中有三條記錄假設檔案號相同,按塊號,行號排列如下:
1080
1081
1082
刪除中間一條記錄後,得到
1080
1082
再增加一條記錄,可能會得到
1080
1081 <---新增加的記錄
1082
也可能是
1080
1082
1083 <---新增加的記錄
兩種情況均有可能出現,取決於oracle塊內的分配演算法。關於該情況的更深入的分析可以參見文獻2。
2.後插入的記錄的塊號有可能大,有可能小
插入記錄的塊號並不是線性增加的,而是受freelist控制。有關freelist的理論和演算法可以參見文獻1。
因此對於全表掃瞄可以得出以下結論:
1. 在oracle中
select*frommytable不能保證返回的記錄
順序是按插入的先後
順序,而是按rowid
順序。rowid的
順序與記錄行儲存的「物理序」一致。在沒有索引情況下,
select作全表掃瞄,是按「物理序」,此時
select
返回記錄按「物理序」最快。1
select返回的記錄順序
select返回記錄的順序對我們程式設計方式有較大影響,因此有必要明確select返回記錄的順序。select返回記錄的順序與資料庫型別有很大關係,與索引情況也有很大關係,以下分類討論。1.在oracle中 1 如果select 後面的where條件中不含索引,oracle按rowid的大小順序來返...
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...