【DB筆試面試561】在Oracle中,如何預估即將建立索引的大小?


♣          題目         部分

在Oracle中,如何預估即將建立索引的大小?程序員


     
♣          答案部分          



若是當前表大小是1TB,那麼在某一列上建立索引的話索引大概佔用多大的空間?對於這個問題,Oracle提供了2種能夠預估將要建立的索引大小的辦法:面試

① 利用系統包DBMS_SPACE.CREATE_INDEX_COST直接獲得。利用DBMS_SPACE.CREATE_TABLE_COST能夠得到將要建立的表的大小。數據庫

② 利用Oracle 11g新特性NOTE RAISED WHEN EXPLAIN PLAN FOR CREATE INDEX。ide

下面分別舉例說明。spa

數據庫版本爲Oracle 11.2.0.3,實驗過程以下所示:.net

1SQL> CREATE TABLE TEST_INDEX_SIZE AS  SELECT * FROM DBA_OBJECTS;
2Table created.
3SQL>  EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'SYS',TABNAME => 'TEST_INDEX_SIZE');
4PL/SQL procedure successfully completed.
     


第一種辦法:DBMS_SPACE.CREATE_INDEX_COSTorm

 1SQL> SET SERVEROUTPUT ON
 2SQL> DECLARE
 3  2    L_INDEX_DDL     VARCHAR2(1000);
 4  3    L_USED_BYTES     NUMBER;
 5  4    L_ALLOCATED_BYTES NUMBER;
 6  5  BEGIN
 7  6    DBMS_SPACE.CREATE_INDEX_COST(DDL     => 'CREATE INDEX IDX_T ON SYS.TEST_INDEX_SIZE(OBJECT_ID)',
 8  7                      USED_BYTES  => L_USED_BYTES,
 9  8                      ALLOC_BYTES => L_ALLOCATED_BYTES);
10  9    DBMS_OUTPUT.PUT_LINE('USED= ' || L_USED_BYTES || 'BYTES' ||
11 10                  '     ALLOCATED= ' || L_ALLOCATED_BYTES || 'BYTES');
12 11  END;
13 12  /
14USED= 383105BYTES     ALLOCATED= 2097152BYTES
15PL/SQL procedure successfully completed.
     


 

說明:USED_BYTES表明實際使用的字節數,而ALLOCATED表明申請的字節數。blog

第二種辦法:Oracle 11g新特性:NOTE RAISED WHEN EXPLAIN PLAN FOR CREATE INDEX索引

這是一個很是實用的小特性,在Oracle 11gR2中使用EXPLAIN PLAN FOR CREATE INDEX時,Oracle會提示評估的索引大小(ESTIMATED INDEX SIZE)了:hash

 1SQL> SET LINESIZE 200 PAGESIZE 1400;
 2SQL>  EXPLAIN PLAN FOR CREATE INDEX IDX_T ON SYS.TEST_INDEX_SIZE(OBJECT_ID);
 3Explained.
 4SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
 5PLAN_TABLE_OUTPUT
 6-------------------------------------------------------------------------------------
 7Plan hash value: 32582980
 8--------------------------------------------------------------------------------
 9| Id  | Operation               | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
10--------------------------------------------------------------------------------
11|   0 | CREATE INDEX STATEMENT |       | 76621 |   374K|   350  (1) | 00:00:05 |
12|   1 |  INDEX BUILD NON UNIQUE| IDX_T |       |       |            |            |
13|   2 |   SORT CREATE INDEX    |       | 76621 |   374K|               |             |
14|   3 |    INDEX FAST FULL SCAN| IDX_T |       |       |               |             |
15--------------------------------------------------------------------------------
16Note
17-----
18   - estimated index size: 2097K bytes
1914 rows selected.
     


建立真實索引查看佔用的字節數:

1SQL> CREATE INDEX IDX_T ON SYS.TEST_INDEX_SIZE(OBJECT_ID);
2Index created.
3SQL>  ANALYZE INDEX IDX_T VALIDATE STRUCTURE;
4Index analyzed.
5SQL> SELECT BYTES FROM DBA_SEGMENTS WHERE SEGMENT_NAME='IDX_T';
6     BYTES
7----------
8   2097152
     


從上面的內容能夠看到,兩種辦法給出的索引評估大小與實際索引佔用空間大約都爲2M,因此,差異並不大,但這裏有個前提條件就是預估索引大小以前必須對錶進行分析過。

& 說明:

有關如何預估即將建立索引的大小能夠參考個人BLOG:http://blog.itpub.net/26736162/viewspace-1381160/

 



本文選自《Oracle程序員面試筆試寶典》,做者:李華榮。



watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=     

---------------優質麥課------------

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

相關文章
相關標籤/搜索