我正在考慮在Oracle表中添加一個索引,但是我想先建立索引的大小(我不需要精確的大小 - 只是一個估計值)。如何估算Oracle索引的大小?
假設我可以訪問有關表的所有元數據(行數,列數,列數據類型等),我可以執行任意Oracle SQL查詢以獲取有關表的當前狀態的其他數據,以及我知道我想要的索引定義是什麼,我怎麼估計這個大小?
我正在考慮在Oracle表中添加一個索引,但是我想先建立索引的大小(我不需要精確的大小 - 只是一個估計值)。如何估算Oracle索引的大小?
假設我可以訪問有關表的所有元數據(行數,列數,列數據類型等),我可以執行任意Oracle SQL查詢以獲取有關表的當前狀態的其他數據,以及我知道我想要的索引定義是什麼,我怎麼估計這個大小?
您可以使用這些Oracle Capacity planning and Sizing Spreadsheets。
對於一些不是很全面的,如果你只是想回信封類型rough estimates for the index的:
計算每個 列組成索引鍵 的平均大小和求和列加上一個rowid和 爲索引行標題添加2個字節 以獲得平均行大小。現在添加 只是一點點,爲 索引的PCTFREE值拿出架空 因素,也許1.125爲10
數目的索引表中的行X平均排 LEN PCTFREE X 1.125
注 - 如果索引包含可爲空的 列,則每個錶行可能不會在索引中出現 。在單列 列索引中,其中90%的列 爲空,只有10%將進入 索引。
將估計值與表空間範圍進行比較 分配方法並在必要時調整最終的 答案。
此外較大開銷因子可以是 更好爲指標變大,因爲 更多的數據索引的多個分支 塊必要支持索引 結構和計算真的 只是數字爲葉塊。
您可以通過運行在create index語句的explain plan
估計索引的大小:
create table t as
select rownum r
from dual
connect by level <= 1000000;
explain plan for
create index i on t (r);
select *
from table(dbms_xplan.display(null, null, 'BASIC +NOTE'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1744693673
---------------------------------------
| Id | Operation | Name |
---------------------------------------
| 0 | CREATE INDEX STATEMENT | |
| 1 | INDEX BUILD NON UNIQUE| I |
| 2 | SORT CREATE INDEX | |
| 3 | TABLE ACCESS FULL | T |
---------------------------------------
Note
-----
- estimated index size: 4194K bytes
看底部的「注」部分:估計的索引大小:4194K字節
從版本10gR2中開始,你可以使用DBMS_SPACE.CREATE_INDEX_COST
DBMS_SPACE.CREATE_INDEX_COST (
ddl IN VARCHAR2,
used_bytes OUT NUMBER,
alloc_bytes OUT NUMBER,
plan_table IN VARCHAR2 DEFAULT NULL);
來自文檔:「此過程確定在現有表上創建索引的成本。輸入是將用於創建索引的DDL語句。該過程將輸出創建索引所需的存儲空間。「
見https://docs.oracle.com/database/121/ARPLS/d_space.htm#ARPLS68101
例(也在sqlfiddle):
DECLARE
ub NUMBER;
ab NUMBER;
BEGIN
DBMS_SPACE.CREATE_INDEX_COST (
ddl => 'CREATE INDEX x_1 ON t1 (a,b,c) TABLESPACE users',
used_bytes => ub,
alloc_bytes => ab
);
DBMS_OUTPUT.PUT_LINE('Used MBytes: ' || ROUND(ub/1024/1024));
DBMS_OUTPUT.PUT_LINE('Alloc MBytes: ' || ROUND(ab/1024/1024));
END;
/
輸出:
Used MBytes: 1
Alloc MBytes: 2
才8年後,我需要它 - 但是,很方便,但是:) – Jared 2017-08-20 14:24:56