Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle 11 इंडेक्स केवल डेटा के भाग के लिए

पहले मुझे यह सुनिश्चित करने दें कि मैं प्रश्न को सही ढंग से समझ रहा हूँ:

  • आप गति बढ़ाना चाहते हैं SELECT .. WHERE C_D IS NULL लेकिन आप नहीं . करते हैं गैर-NULL C_D की खोज करने वाली किसी भी क्वेरी को गति देना चाहते हैं।
  • आप यह भी सुनिश्चित करना चाहते हैं कि स्थान बचाने के लिए कोई "अनावश्यक" गैर-नल मान अनुक्रमणिका में नहीं हैं।

अगर वह समझ सही है, तो आपको जो चाहिए वह है कार्यात्मक अनुक्रमणिका। अर्थात। किसी फ़ील्ड पर किसी फ़ंक्शन पर एक अनुक्रमणिका, फ़ील्ड ही नहीं...

CREATE INDEX T_IE1 ON T (CASE WHEN C_D IS NULL THEN 1 ELSE NULL END) COMPRESS

...जिसे आप तब पूछेंगे...

SELECT * FROM T WHERE (CASE WHEN C_D IS NULL THEN 1 ELSE NULL END) = 1

...जो इसके बराबर है...

SELECT * FROM T WHERE C_D IS NULL

...लेकिन तेजी से क्योंकि यह सूचकांक का उपयोग करता है:

यह स्थान बचाता है क्योंकि एकल-स्तंभ अनुक्रमणिका NULLs संग्रहीत नहीं करते हैं। साथ ही, COMPRESS का उपयोग करें चूंकि अनुक्रमणिका में केवल एक कुंजी होगी, इसलिए अनुक्रमणिका संरचना में एक ही कुंजी को बार-बार दोहराने पर स्थान बर्बाद करने की कोई आवश्यकता नहीं है।

नोट:Oracle 11 के अंतर्गत, आप एक फ़ंक्शन-आधारित वर्चुअल कॉलम<भी बना सकते हैं। /ए> (CASE के आधार पर) अभिव्यक्ति ऊपर), फिर कुछ दोहरावदार टाइपिंग को बचाने के लिए सीधे उस कॉलम पर इंडेक्स और क्वेरी करें।

--- संपादित करें ---

अगर आप भी C_D IS NULL . के साथ C_I पर क्वेरी करने में रुचि रखते हैं , आप कर सकते हैं...

CREATE UNIQUE INDEX T_IE2 ON T (C_I, CASE WHEN C_D IS NULL THEN 1 ELSE NULL END)

...और इसके साथ क्वेरी करें (उदाहरण के लिए)...

SELECT * FROM T WHERE C_I > 'some value' AND (CASE WHEN C_D IS NULL THEN 1 ELSE NULL END) = 1

...जो इसके बराबर है...

SELECT * FROM T WHERE C_I > 'some value' AND C_D IS NULL

...लेकिन तेज़, क्योंकि यह T_IE2 . अनुक्रमणिका का उपयोग करता है ।

यह वास्तव में एकमात्र इंडेक्स है जिसे आपको अपनी टेबल पर चाहिए (यह प्राथमिक कुंजी को "कवर" करता है, इसलिए अब आपको केवल C_I पर एक अलग इंडेक्स की आवश्यकता नहीं है)। जिसका अर्थ यह भी है कि एक ही ROWIDs को कभी भी एक से अधिक अनुक्रमणिका में संग्रहीत नहीं किया जाता है, जिससे स्थान की बचत होती है।

नोट:COMPRESS अनुक्रमणिका T_IE2 के लिए अब कोई अर्थ नहीं है ।

--- संपादित करें 2 ---

यदि आप स्थान से अधिक सरलता की परवाह करते हैं, तो आप केवल {C_I, C_D} पर एक समग्र अनुक्रमणिका बना सकते हैं। जब तक एक ही टपल में कम से कम एक गैर-नल मान होता है, तब तक Oracle समग्र अनुक्रमणिका में NULL मानों को संग्रहीत करता है:

CREATE UNIQUE INDEX T_IE3 ON T (C_I, C_D)

यह सूचकांक का उपयोग करता है:

SELECT * FROM T WHERE C_I > 1 AND C_D IS NULL

पिछले EDIT की तरह, यह एकमात्र इंडेक्स है जिसकी आपको अपनी टेबल पर आवश्यकता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. चयन से Oracle अद्यतन - एक ही तालिका

  2. Oracle एक क्वेरी में दो तालिकाओं में सम्मिलित करें

  3. Oracle SQL डेवलपर में एक्ज़ीक्यूट एक्सप्लोरेशन प्लान के परिणामों को समझना

  4. तालिका में लगातार डुप्लिकेट कैसे गिनें?

  5. Oracle SQL सर्वर STUFF फ़ंक्शन के बराबर है?