2010-01-28 14 views
16

जहाँ तक मुझे पता है (this page) ओरेकल स्वचालित रूप से प्रत्येक अद्वितीय या प्राथमिक कुंजी घोषणा के लिए एक सूचकांक बनाता है। क्या यह ओरेकल में इंडेक्स स्वचालित रूप से बनाए जाने पर मामलों की एक पूरी सूची है?ओरेकल स्वचालित रूप से इंडेक्स कैसे बनाएगा?

उत्तर

20

मैं दिए गए उत्तरों को मजबूत करने और इसे समुदाय विकी बनाने की कोशिश करूंगा।
तो अनुक्रमित स्वचालित रूप से इस तरह के मामलों के लिए Oracle द्वारा बनाई गई हैं:

  1. APC: प्राथमिक कुंजी और अद्वितीय कुंजी जब तक इस तरह अनुक्रमित पहले से ही मौजूद है।
  2. APC: LOB स्टोरेज और XMLType के लिए।
  3. Gary: घोंसला वाली तालिका वाली तालिका के लिए।
  4. Jim Hudson: भौतिक दृश्य के लिए।
+0

"LOB स्टोरेज" केस शायद अन्य जटिल डेटाटाइप के लिए इंडेक्स में भी परिणाम देता है। हालांकि मैंने इसका परीक्षण नहीं किया है। मैं उम्मीद करता हूं कि ओरेकल स्पेटियल, ओरेकल टेक्स्ट इत्यादि द्वारा इंडेक्स बनने की उम्मीद है। –

+0

यह समुदाय विकी है। अगर आप कुछ भी जोड़ना चाहते हैं, तो आप बस इस जवाब को संपादित कर सकते हैं। –

0

हां, यह पूरी सूची है। ओरेकल स्वचालित रूप से प्रत्येक अद्वितीय या प्राथमिक कुंजी घोषणा के लिए एक सूचकांक बनाता है।

+0

[स्वीकृत उत्तर] (http://stackoverflow.com/a/2192193/521799) के अनुसार यह पूरी सूची नहीं है ... –

18

सबसे पहले, जब हम प्राथमिक या अद्वितीय कुंजी बनाते हैं तो ओरेकल हमेशा एक इंडेक्स नहीं बनाता है। यदि पहले से ही उस स्तंभ पर एक सूचकांक है यह इसके बजाय का उपयोग करेगा ...

SQL> create table t23 (id number not null) 
    2/

Table created. 

SQL> create index my_manual_idx on t23 (id) 
    2/

Index created. 

SQL> select index_name from user_indexes 
    2 where table_name = 'T23' 
    3/

INDEX_NAME 
------------------------------ 
MY_MANUAL_IDX 

SQL> 

... ध्यान दें कि MY_MANUAL_IDX एक अद्वितीय सूचकांक नहीं है; यह कोई बात नहीं ...

SQL> alter table t23 
    2  add constraint t23_pk primary key (id) using index 
    3/

Table altered. 

SQL> select index_name from user_indexes 
    2 where table_name = 'T23' 
    3/

INDEX_NAME 
------------------------------ 
MY_MANUAL_IDX 

SQL> drop index my_manual_idx 
    2/
drop index my_manual_idx 
      * 
ERROR at line 1: 
ORA-02429: cannot drop index used for enforcement of unique/primary key 


SQL> 

एक और मामला है जब ओरेकल स्वचालित रूप से एक सूचकांक बनाएगा है: LOB भंडारण ....

SQL> alter table t23 
    2  add txt clob 
    3  lob (txt) store as basicfile t23_txt (tablespace users) 
    4/

Table altered. 

SQL> select index_name from user_indexes 
    2 where table_name = 'T23' 
    3/

INDEX_NAME 
------------------------------ 
MY_MANUAL_IDX 
SYS_IL0000556081C00002$$ 

SQL> 

संपादित

डेटाबेस व्यवहार करता है XMLType अन्य LOBs के समान ही ...

SQL> alter table t23 
    2  add xmldoc xmltype 
    3/

Table altered. 

SQL> select index_name from user_indexes 
    2 where table_name = 'T23' 
    3/

INDEX_NAME 
------------------------------ 
MY_MANUAL_IDX 
SYS_IL0000556081C00002$$ 
SYS_IL0000556081C00004$$ 

SQL>  
+0

मैंने कुछ वर्षों तक ओरेकल नहीं किया है, लेकिन मुझे लगता है याद करने के लिए कि ओरेकल एक समग्र सूचकांक का उपयोग कर सकता है, यदि फ़ील्ड अद्वितीय (या प्राथमिक कुंजी?) पर सेट किया गया पहला क्षेत्र था। मैं गलत याद कर सकता हूं, या यह 8i लाइन के बाद बदल सकता है, इसलिए अगर यह उपयोगी होगा तो मैं इसका परीक्षण करने का सुझाव दूंगा। (एक अतिरिक्त इंडेक्स रखने और लिखने में हिट लेने से बचाने के लिए) – Joe

+0

एक उदाहरण समझने के लिए हमेशा महान होता है। – Guru

+0

@ जो - हाँ, आपकी यादें सही हैं। – APC

3

नहीं, हम हैं करीब आना लेकिन यह अभी तक पूरी सूची नहीं है।

जब आप भौतिक दृश्य बनाते हैं तो स्वचालित रूप से एक इंडेक्स भी बनाया जाएगा क्योंकि ओरेकल को तेजी से रीफ्रेश करते समय पंक्तियों की तुरंत पहचान करने में सक्षम होना चाहिए। पंक्तिबद्ध आधारित भौतिक विचारों के लिए, यह I_SNAP $ _tablename का उपयोग करता है। प्राथमिक कुंजी भौतिक विचारों के लिए, यह मूल पीके नाम का उपयोग करता है, इसे अद्वितीय बनाने के लिए आवश्यक के रूप में संशोधित किया जाता है।

create materialized view testmv 
refresh force with rowid 
as select * from dual; 

select index_name from user_indexes where table_name = 'TESTMV'; 

Index Name 
-------------- 
I_SNAP$_TESTMV 
2

और दूसरा, यदि आप नेस्टेड टेबल के साथ एक टेबल बनाते हैं तो आपको स्वचालित रूप से एक अनुक्रमणिका मिलती है। ऑब्जेक्ट आधारित स्टोरेज सामान्य रूप से ऐसा कर सकता है क्योंकि बनाई गई छिपी हुई टेबल हो सकती हैं।

मुझे लगता है कि स्कीमा-आधारित XMLTypes भी ऐसा करेंगे।

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