「假設我有沒有其他的指數比 隱含一個主鍵 (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。
來源
2010-08-10 03:50:09
APC
「由於ROWID不佔用任何存儲空間」誰告訴你的? – 2010-08-09 13:01:54
這是真的 - ROWID不存儲在表中。它當然存儲在桌上的索引中! – 2010-08-09 13:06:37
@Adam:在問題中包含源代碼。 – Moeb 2010-08-09 13:21:48