select返回記錄的順序
關鍵字:select 1.簡介 當我們執行了select語句,select返回的記錄的順序對我們編程方式有較大影響,對 數據庫 記錄備份清除以及 sql 性能 優化都有很大的關系。因此有必要明確select返回記錄的順序。 select返回記錄的順序與數據庫類型有很大關系,因此以下
關鍵字:select
1.簡介
當我們執行了select語句,select返回的記錄的順序對我們編程方式有較大影響,對
數據庫記錄備份清除以及
sql性能優化都有很大的關系。因此有必要明確select返回記錄的順序。
select返回記錄的順序與數據庫類型有很大關系,因此以下按數據庫類型分別討論。本文主要討論了
oracle/sybase/sql server返回記錄的順序,從原理探討三種數據庫各自的特點,并著重探討了這些差異對數據查詢及記錄備份的影響。
2. oracle
以下假設數據庫查詢優化方式均為基于rule的方式,ORACLE 采用兩種訪問表中記錄的方式:
a. 全表掃描 (Full Table Scan)
全表掃描就是順序地訪問表中每條記錄. ORACLE采用一次讀入多個數據塊(database block)的方式優化全表掃描。
b. 通過ROWID訪問表
你可以采用基于ROWID的訪問方式情況,提高訪問表的效率,ROWID包含了表中記錄的物理位置信息。ORACLE采用索引(INDEX)實現了數據和存放數據的物理位置(ROWID)之間的聯系。通常索引提供了快速訪問ROWID的方法,因此那些基于索引列的查詢就可以得到性能上的提高。通常表現為按索引掃描。(Index Scan)
2.1全表掃描
如果select語句不能使用索引,則
Oracle按全表掃描方式讀取數據塊,對于返回的結果集,oracle按rowid的大小順序來返回記錄。因此 select * from mytable 與 select * from mytable order by rowid效果是一樣的
可以通過select rowid from table得到rowid偽列,數據類型為ROWID類型。使用查詢語句返回的是ROWID的擴展格式(Extended Rowid)。擴展格式的ROWID由18個字符組成。這18個字符可以按照OOOOOO.FFF.BBBBBB.SSS的格式分為4組。分別代表數據對象編號(Data Object Number),數據文件編號(Datafile Number),數據塊編號(Data Block Number),記錄或記錄片斷的塊內行號。
必須說明的是,并不是后插入記錄的rowid就越大,有可能后插入的記錄rowid還要小。下面給出兩個論點加以證明:
1.后插入的記錄塊內行號可能大,也可能小
根據我們的試驗,假設現在表中有三條記錄假設文件號相同,按塊號,行號排列如下:
原文轉自:http://www.anti-gravitydesign.com