2010-08-09 56 views
1

例如,如果我這樣做查詢時從哪裏獲取ROWID?

SELECT ROWID, name from emp where age > 30; 

由於ROWID不採取任何的存儲空間,它是每一個計算這樣的查詢運行時間?


here

每個表在Oracle數據庫中 內部有一個名爲 ROWID僞列。通過執行SELECT * FROM ...語句上市時的 表結構,或DESCRIBE ...使用SQL語句 * Plus中,也不該 虛列佔用空間,在這虛列不 明顯 表


以線索從註釋,當你創建一個索引

ROWID存儲。假設我沒有其他索引而不是主鍵的隱式索引(emp_id)。 在這種情況下,上述查詢會轉到這個隱式索引嗎? ROWID計算如何發生?

請注意,nameage列不是索引的一部分。

+0

「由於ROWID不佔用任何存儲空間」誰告訴你的? – 2010-08-09 13:01:54

+0

這是真的 - ROWID不存儲在表中。它當然存儲在桌上的索引中! – 2010-08-09 13:06:37

+0

@Adam:在問題中包含源代碼。 – Moeb 2010-08-09 13:21:48

回答

1

「假設我有沒有其他的指數比 隱含一個主鍵 (EMP_ID)。在這種情況下,將上述 查詢到這個隱含的指數?如何 將ROWID計算髮生的呢? 「

首先,「隱式索引」是一個真正的索引。如果我們在表上創建主鍵或唯一鍵,並且鍵列上不存在索引,則Oracle會創建一個索引,其名稱與約束名稱相同。

SQL> create table t72 
    2  (emp_id number not null primary key 
    3  , name varchar2(10) not null 
    4  , age number(3,0)) 
    5/

Table created. 

SQL> select constraint_name from user_constraints 
    2 where table_name = 'T72' 
    3 and constraint_type='P' 
    4/

CONSTRAINT_NAME 
------------------------------ 
SYS_C001145039 

1 row selected. 

SQL> select index_type, uniqueness 
    2 from user_indexes 
    3 where index_name = 'SYS_C001145039' 
    4/

INDEX_TYPE     UNIQUENES 
--------------------------- --------- 
NORMAL      UNIQUE 

1 row selected. 

SQL> 

其次,年齡列的查詢過濾器。所以優化器會忽略EMP_ID上的任何索引。在這種情況下,數據庫將對EMP執行全表掃描,評估其檢索的每個AGE列的值。對於每個記錄,它將把表格的對象編號,塊編號,插槽編號和文件編號連接成一個ROWID。

如果您想了解更多關於ROWID的信息,請參閱DBMS_ROWID包。 RenéNyffenegger在他的網站上有一個有用的教程。Find out more.


「假設它是SELECT ROWID,從EMP名 其中EMP_ID> 100 ;.會 查詢從 EMP_ID指數獲取ROWID?」

有一個簡單的告訴的方式:實驗。首先,我們在表上創建索引有很多的記錄,清新的統計數據:

SQL> create unique index big_i on big_emp (empno) 
    2/

Index created. 

SQL> exec dbms_stats.gather_table_stats(user, 'BIG_EMP', cascade=>true) 

PL/SQL procedure successfully completed. 

SQL> 

然後,我們看到了Oracle如何剷球查詢:

SQL> explain plan for 
    2  select empno, rowid from big_emp 
    3  where empno > 10000; 

Explained. 

SQL> select * from table(dbms_xplan.display) 
    2/

PLAN_TABLE_OUTPUT 
------------------------------------------------------------------------------ 
Plan hash value: 3238483832 

------------------------------------------------------------------------------ 
| Id | Operation   | Name | Rows | Bytes | Cost (%CPU)| Time  | 
------------------------------------------------------------------------------ 
| 0 | SELECT STATEMENT  |  | 24319 | 403K| 16 (0)| 00:00:01 | 
|* 1 | INDEX FAST FULL SCAN| BIG_I | 24319 | 403K| 16 (0)| 00:00:01 | 
------------------------------------------------------------------------------ 

Predicate Information (identified by operation id): 
--------------------------------------------------- 

    1 - filter("EMPNO">10000) 

13 rows selected. 

SQL> 

如果甲骨文能夠滿足只查詢索引列不會觸及表格。顯然這裏是從索引中撤消ROWID。

+0

謝謝!假設它是'SELECT ROWID,emp_id> 100; emp'的名稱。查詢是否會從'emp_id'索引中獲取ROWID? – Moeb 2010-08-10 10:08:54

+0

非常感謝@APC。 – Moeb 2010-08-13 03:55:14

3

rowid是該行的屬性。它包含有關該塊位置(文件編號,塊編號)和該塊內該行位置的信息。

這個信息在查詢時並不是真正的「計算」,而僅僅是從該行的塊頭中的信息組合而來。