Oracle資料庫中rowid與rownum的區別

2021-08-25 01:45:56 字數 1730 閱讀 7904

在查詢中,我們可以注意到,類似於「select xx from table

where rownum < n」(n>1)這樣的查詢是有正確含義的,而「select xx from table where rownum = n」這樣的查詢只在n=1的時候成立,「select xx from table where rownum > n」(n>1)這樣的查詢只能得到乙個空集。另外「select xx from table where rownum > 0」這個查詢會返回所有的記錄。這是為什麼呢?原因就在於oracle對rownum的處理上,rownum是在得到結果集的時候產生的,用於標記結果集中結果順序的乙個字段,這個欄位被稱為「偽數列」,也就是事實上不存在的乙個數列。它的特點是按順序標記,而且是逐次遞加的,換句話說就是只有有rownum=1的記錄,才可能有rownum=2的記錄。

讓我們回頭來分析一下在where中使用rownum作為查詢條件的情況。在rownum取=1,或者rownum <= n (n>1)的時候,沒有問題。那麼為什麼當條件為rownum = n或者rownum >= n時明明有資料卻只能得到乙個空集呢?假設我們的查詢條件為rownum = 2,那麼在查詢出的第一條記錄的時候,oracle標記此條記錄rownum為1,結果發現和rownum=2的條件不符,於是結果集為空。寫到這裡,我忽然有乙個有趣的想法:假如有一條查詢語句為select xx,yy from table where zz > 20 and rownum < 10,那麼在執行的時候,是先按照zz>20的條件查詢出乙個結果集,然後按照rownum取出前10條返回?還是在按照zz>20的條件先查詢,然後有乙個記錄就標記乙個rownum,到rownum<10的時候就停止查詢?我覺得應該是後者,也就是在執行語句的時候,不是做full scan,而是取夠資料就停止查詢。要驗證這個想法應該很簡單,找乙個資料量非常大的表進行查詢就可以了。可惜目前我沒有這樣的表。

我們可以看出,直接使用rownum是要受到限制的。但是很容易遇到這樣的需求「查出符合條件的第xx條到第xx條記錄」,比如頁面的分頁處理。這個時候如何構造出適合自己的結果集?嗯,牆邊那位說全取出來手工挑選的哥們可以拉出去了。當然這樣做也是可以的,但是前提是整個資料集的資料條數不多的情況下。假如遇到上十萬百條的資料,全部取出來的話,使用者就不用幹別的事情了。這個時候使用者應該怎麼做呢?當然就是要用到我們介紹的rownum拉!rownum不是個「偽數列」麼,好說,我們現在把它弄成乙個實在的字段就可以了。

具體做法就是利用子查詢,在構建臨時表的時候,把rownum也一起構造進去。比如「select xx,yy from (select xx,yy,rownum as xyz from table where zz >20) where xyz between 10 and 20」這樣就可以了。另外使用oracle提供的結果集處理函式minus也可以做到,例如「select xx,yy from table where zz > 20 and rownum <20 minus select xx,yy from table where zz>20 and rownum <10」,但是使用minus好像比使用子查詢更加消耗資源。和rownum相似,oracle還提供了另外乙個偽數列:rowid。不過rowid和rownum不同,一般說來每一行資料對應的rowid是固定而且唯一的,在這一行資料存入資料庫的時候就確定了。可以利用rowid來查詢記錄,而且通過rowid查詢記錄是查詢速度最快的查詢方法。(這個我沒有試過,另外要記住乙個長度在18位,而且沒有太明顯規律的字串是乙個很困難的事情,所以我個人認為利用rowid查詢記錄的實用性不是很大)rowid只有在表發生移動(比如表空間變化,資料匯入/匯出以後),才會發生變化。

資料庫rowid實現問題

在實現位圖索引的時候,出現了一些問題,引發出對rowid的一些思考。位圖索引的目的就是對於重複值較多的字段,如果通過b樹索引,可能要不斷的進行比較操作,而使用位圖索引,則可以通過按位操作直接定位到滿足條件的記錄上,這樣位圖索引對於每個關鍵字的值都應該有乙個位圖,通過按位操作,找到記錄的rowid,然...

資料庫 Oracle中建立資料庫

create database lihua 網上的說法是 oracle中的例項只對應乙個資料庫,出現此種情況說明oracle資料庫處於mount 裝載 或open狀態,需要使用startup nomount語句進行狀態更改,或者是直接使用dbca的圖形介面來建立 注 經測試,startup nomo...

oracle資料庫中sql notfound的用法

sql notfound 是乙個布林值。與最近的sql語句 update,insert,delete,select 發生互動,當最近的一條sql語句沒有涉及任何行的時候,則返回true。否則返回false。這樣的語句在實際應用中,是非常有用的。例如要update一行資料時,如果沒有找到,就可以作相應...