2009-05-05 14 views
7

मैं ओरेकल तालिका में एक इंडेक्स जोड़ने पर विचार कर रहा हूं, लेकिन मैं पहले इसे बनाने के बाद इंडेक्स के आकार का अनुमान लगा सकता हूं (मुझे सटीक आकार की आवश्यकता नहीं है - केवल एक अनुमान।)मैं ओरेकल इंडेक्स के आकार का अनुमान कैसे लगा सकता हूं?

मान लीजिए कि मेरे पास टेबल के बारे में सभी मेटा-डेटा तक पहुंच है (पंक्तियों, कॉलम, कॉलम डेटा प्रकारों आदि की संख्या) कि मैं तालिका की वर्तमान स्थिति के बारे में अतिरिक्त डेटा प्राप्त करने के लिए किसी भी मनमाने ढंग से ओरेकल एसक्यूएल क्वेरी निष्पादित कर सकता हूं, और मुझे पता है कि मैं इंडेक्स परिभाषा क्या चाहता हूं, मैं इस आकार का अनुमान कैसे लगा सकता हूं?

उत्तर

10

आप इन Oracle Capacity planning and Sizing Spreadsheets का उपयोग कर सकते हैं।

कुछ काफी नहीं के रूप में के लिए पूर्ण विकसित, अगर आप सिर्फ लिफाफा प्रकार rough estimates for the index के पीछे हैं:

स्तंभों में से प्रत्येक कि ऊपर सूचकांक कुंजी बनाने के औसत आकार की गणना करें और योग कॉलम प्लस वन रैपिड और औसत पंक्ति आकार प्राप्त करने के लिए इंडेक्स पंक्ति शीर्षलेख के लिए 2 बाइट जोड़ें। अब की 10

अनुक्रमित तालिका पंक्तियों की संख्या एक्स औसत पंक्ति लेन pctfree के लिए 1.125 एक ओवरहेड कारक साथ आने के लिए, हो सकता है सूचकांक के लिए pctfree मूल्य के लिए सिर्फ एक छोटे से जोड़ने एक्स 1.125

नोट - अगर इंडेक्स में कॉलम शामिल हैं तो प्रत्येक तालिका पंक्ति इंडेक्स में दिखाई नहीं दे सकती है। एक कॉलम इंडेक्स पर जहां 90% कॉलम शून्य हैं केवल 10% अनुक्रमणिका में जाएंगे।

टेबलस्पेस सीमा आवंटन विधि के अनुमान की तुलना करें और यदि आवश्यक हो तो अंतिम उत्तर समायोजित करें।

इसके अलावा एक बड़ा भूमि के ऊपर कारक बेहतर सूचकांक हो जाता है के रूप में बड़ा के बाद से अधिक डेटा अधिक शाखा ब्लॉक आवश्यक अनुक्रमित सूचकांक संरचना और गणना वास्तव में सिर्फ पत्ती ब्लॉकों के लिए आंकड़े समर्थन करने के लिए हो सकता है।

2

आप बनाने के सूचकांक के विवरण में explain plan चलाकर एक सूचकांक के आकार का अनुमान कर सकते हैं: अनुमान सूचकांक का आकार:: 4194K बाइट्स

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  

तल पर "नोट" अनुभाग देखें

0

संस्करण 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); 

दस्तावेज़ों से: "यह प्रक्रिया मौजूदा तालिका पर एक इंडेक्स बनाने की लागत निर्धारित करती है। इनपुट डीडीएल कथन है जिसका उपयोग इंडेक्स बनाने के लिए किया जाएगा। प्रक्रिया इंडेक्स बनाने के लिए आवश्यक स्टोरेज आउटपुट करेगा।"

देखें 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 
+0

केवल 8 साल के बाद मैं यह आवश्यक है - लेकिन, काम, फिर भी :) – Jared

संबंधित मुद्दे

 संबंधित मुद्दे