यदि आपको कुंजी में उस कॉलम की आवश्यकता नहीं है, तोINCLUDE कुंजी-कॉलम को प्राथमिकता देने का एक कारण दस्तावेज़ीकरण है। यह भविष्य में सूचकांक को और अधिक आसान बनाता है।
आपके उदाहरण को ध्यान में रखते हुए:
CREATE INDEX idx1 ON MyTable (Col1) INCLUDE (Col2, Col3)
यदि आपकी क्वेरी इस तरह दिखती है तो यह सूचकांक सबसे अच्छा है:
SELECT col2, col3
FROM MyTable
WHERE col1 = ...
निश्चित रूप से आपको कॉलम नहीं रखना चाहिए INCLUDEयदि आप उन्हें मुख्य भाग में होने से अतिरिक्त लाभ प्राप्त कर सकते हैं। निम्नलिखित दोनों प्रश्न वास्तव col2में सूचकांक की कुंजी में कॉलम को पसंद करेंगे ।
SELECT col2, col3
FROM MyTable
WHERE col1 = ...
AND col2 = ...
SELECT TOP 1 col2, col3
FROM MyTable
WHERE col1 = ...
ORDER BY col2
मान लेते हैं कि ऐसा नहीं है और हमारे पास col2हैINCLUDE खंड है, क्योंकि सिर्फ सूचकांक के पेड़ भाग में यह होने का कोई लाभ नहीं।
कुछ साल तेजी से आगे बढ़ा।
आपको इस क्वेरी को ट्यून करने की आवश्यकता है:
SELECT TOP 1 col2
FROM MyTable
WHERE col1 = ...
ORDER BY another_col
उस क्वेरी को ऑप्टिमाइज़ करने के लिए, निम्न सूचकांक बहुत अच्छा होगा:
CREATE INDEX idx1 ON MyTable (Col1, another_col) INCLUDE (Col2)
यदि आप जाँचते हैं कि आपके पास उस तालिका में पहले से क्या सूचकांक हैं, तो आपका पिछला सूचकांक अभी भी हो सकता है:
CREATE INDEX idx1 ON MyTable (Col1) INCLUDE (Col2, Col3)
अब आप जानते हैं कि Col2और Col3इंडेक्स ट्री का हिस्सा नहीं हैं और इस प्रकार रीड इंडेक्स को सीमित करने के लिए उपयोग नहीं किया जाता है और न ही पंक्तियों को ऑर्डर करने के लिए। another_columnसूचकांक के कुंजी-भाग के अंत में जोड़ने के लिए सुरक्षित है (बाद में col1)। कुछ भी तोड़ने का जोखिम बहुत कम है:
DROP INDEX idx1 ON MyTable;
CREATE INDEX idx1 ON MyTable (Col1, another_col) INCLUDE (Col2, Col3);
वह इंडेक्स बड़ा हो जाएगा, जिसमें अभी भी कुछ जोखिम हैं, लेकिन आम तौर पर नए को पेश करने की तुलना में मौजूदा इंडेक्स का विस्तार करना बेहतर है।
यदि आपके पास एक सूचकांक है INCLUDE, तो आप यह नहीं जान सकते कि आप किन प्रश्नों को another_colसही जोड़कर तोड़ेंगे Col1।
CREATE INDEX idx1 ON MyTable (Col1, Col2, Col3)
यदि आप और के another_colबीच में क्या होता है ? क्या अन्य प्रश्नों का सामना करना पड़ेगा?Col1Col2
यदि आप उन स्तंभों को तालिका से लाने से बचने के लिए जोड़ते हैं, तोINCLUDE कुंजी कॉलम के अन्य "लाभ" हैं । हालांकि, मैं प्रलेखन पहलू को सबसे महत्वपूर्ण मानता हूं।
तुम्हारे प्रश्न का उत्तर देने के लिए:
INCLUDE क्लॉज़ के साथ या उसके बिना एक कवरिंग इंडेक्स बनाने के लिए आप क्या दिशा-निर्देश तय करेंगे?
यदि आप एकमात्र स्तंभ के लिए इंडेक्स में एक कॉलम जोड़ते हैं, तो उस कॉलम को टेबल पर आए बिना इंडेक्स में उपलब्ध किया जा सकता है, इसे अंदर डालें INCLUDE खंड ।
यदि स्तंभ को इंडेक्स की में जोड़ना अतिरिक्त लाभ (जैसे के लिए) लाता है order by या क्योंकि यह रीड इंडेक्स रेंज को कम कर सकता है) तो इसे कुंजी में जोड़ें।
आप इसके बारे में एक लंबी चर्चा यहाँ पढ़ सकते हैं:
https://use-the-index-luke.com/blog/2019-04/include-columns-in-btree-indexes