2011-05-09 16 views
12

SQLServer के समान मैं कहाँ कर सकते हैं निम्नलिखितक्या ओरेकल में फ़िल्टर की गई इंडेक्स अवधारणा है?

create index TimeSeriesPeriodSs1 on TimeSeriesPeriod (validationStatus, completionStatus) 
where completionStatus= N'Complete' 
and validationStatus= N'Pending' 
+0

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

+1

@tbone - आकार –

+2

@tbone का कारण हो सकता है: फ़िल्टर किए गए इंडेक्स का पूरा बिंदु एक बड़ी तालिका पर एक इंडेक्स को बनाए रखने के ऊपरी हिस्से से बचने के लिए है जब इसकी केवल एक छोटी सबसेट की आवश्यकता होती है। – Gabe

उत्तर

13

आप Oracle में एक समारोह आधारित सूचकांक कि तथ्य यह है कि शून्य मान बी पेड़ अनुक्रमित में संग्रहीत नहीं हैं का लाभ उठाता है बना सकते हैं। की तरह कुछ

CREATE INDEX TimeSeriesPeriodSs1 
    ON TimeSeriesPeriod( 
      (CASE WHEN completionStatus = 'Complete' AND validationStatus = 'Pending' 
       THEN validationStatus 
       ELSE NULL 
      END), 
      (CASE WHEN completionStatus = 'Complete' AND validationStatus = 'Pending' 
       THEN completionStatus 
       ELSE NULL 
      END) 
     ); 
+0

डॉन, फॉइल एगिन ... –

+1

एलेक्स पोल उत्तर बेहतर है, क्योंकि यह आपको उपयोगकर्ता परिभाषित फ़ंक्शन का उपयोग करने के लिए सुझाव देता है ताकि लिखने से बचने के लिए वही जटिल "मामला जब" आपके प्रश्नों में "जहां ऑरैकल इंडेक्स –

10

आप इस के लिए एक समारोह आधारित सूचकांक का उपयोग करने में सक्षम हो सकता है, हालांकि यह इस परिदृश्य के लिए बहुत ही सुखद नहीं है:

create index TimeSeriesPeriodSs1 on TimeSeriesPeriod (
    case when validationStatus= N'Pending' and completionStatus= N'Complete' then validationStatus else null end, 
    case when validationStatus= N'Pending' and completionStatus= N'Complete' then completionStatus else null end); 

आप क्वेरी के where बनाने के लिए होगा यद्यपि यह सूचकांक का उपयोग करने के लिए बिल्कुल ठीक है।

select <fields> 
from TimeSeriesPeriod 
where case when validationStatus= N'Pending' and completionStatus= N'Complete' then validationStatus else null end = N'Pending' 
and case when validationStatus= N'Pending' and completionStatus= N'Complete' then completionStatus else null end = N'Complete'; 

यह एक बहुत neater अगर आप (नियतात्मक) कार्यों case करने के लिए परिभाषित कर सकते हैं होगा। कुछ और जानकारी और उदाहरणों के लिए here देखें। या त्वरित Google से this

+1

+1 का उपयोग करने के लिए खंड को फ़ंक्शन आधारित इंडेक्स का उपयोग करने के लिए खंड कहां शामिल करने के लिए अनुमति देता है। ओरेकल के फ़ंक्शन आधारित इंडेक्स बनाम SQL सर्वर के फ़िल्टर किए गए इंडेक्स का उपयोग करने में यह एक बड़ा अंतर है। –

6

यहाँ जस्टिन और एलेक्स के जवाब पर एक छोटा सा संस्करण कि आगे सूचकांक स्थान बचाने और संशोधित क्वेरी अधिक पठनीय IMO बनाता दे सकता है:

CREATE INDEX TimeSeriesPeriodSs1 
    ON TimeSeriesPeriod( 
      (CASE WHEN completionStatus = 'Complete' AND validationStatus = 'Pending' 
       THEN 1 
       ELSE NULL 
      END); 

SELECT * FROM TimeSeriesPeriod 
    WHERE 1 = (CASE WHEN completionStatus = 'Complete' AND validationStatus = 'Pending' 
       THEN 1 
       ELSE NULL 
      END) 
संबंधित मुद्दे