कंपोजिट इंडेक्स के साथ उपयोग किए जाने पर यह मुख्य रूप से मायने रखता है:
CREATE INDEX ix_index ON mytable (col1, col2 DESC);
या तो के लिए इस्तेमाल किया जा सकता है:
SELECT *
FROM mytable
ORDER BY
col1, col2 DESC
या:
SELECT *
FROM mytable
ORDER BY
col1 DESC, col2
, लेकिन इसके लिए नहीं:
SELECT *
FROM mytable
ORDER BY
col1, col2
एकल कॉलम पर एक इंडेक्स को दोनों तरह से छांटने के लिए कुशलतापूर्वक उपयोग किया जा सकता है।
विवरण के लिए मेरे ब्लॉग में लेख देखें:
अपडेट करें:
वास्तव में, यह एकल कॉलम इंडेक्स के लिए भी मायने रख सकता है, हालांकि यह इतना स्पष्ट नहीं है।
एक तालिका की एक स्तंभ पर एक सूचकांक की कल्पना करो:
CREATE TABLE mytable (
pk INT NOT NULL PRIMARY KEY,
col1 INT NOT NULL
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)
अनुक्रमित पंक्तियों के संदर्भ के साथ-साथ col1
क्रमबद्ध मूल्यों को रखता है col1
।
चूँकि तालिका को क्लस्ट किया गया है, पंक्तियों के संदर्भ वास्तव में हैं pk
। वे भी प्रत्येक मूल्य के भीतर दिए गए हैं col1
।
इसका मतलब यह है कि सूचकांक के पत्ते वास्तव में आदेश दिए गए हैं (col1, pk)
, और यह प्रश्न:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk
कोई छँटाई की जरूरत है।
यदि हम निम्नलिखित के रूप में सूचकांक बनाते हैं:
CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)
, तब के मूल्यों को col1
अवरोही क्रमबद्ध किया जाएगा, लेकिन pk
प्रत्येक मूल्य के भीतर के मूल्यों को col1
आरोही क्रमबद्ध किया जाएगा।
इसका मतलब है कि निम्नलिखित प्रश्न:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk DESC
द्वारा सेवा की जा सकती है ix_mytable_col1_desc
लेकिन द्वारा नहीं ix_mytable_col1
।
दूसरे शब्दों में, CLUSTERED INDEX
किसी भी तालिका पर बनने वाले स्तंभ हमेशा उस तालिका के किसी अन्य सूचकांक के अनुगामी स्तंभ होते हैं।