इंडेक्स_आईडी <256000 का क्या महत्व है?


11

एक निश्चित ट्यूटोरियल में मैंने पढ़ा कि लेखक sys.indexesविधेय के आधार पर फ़िल्टरिंग कर रहा है index_id < 256000। यह क्या पूरा करता है?


2
शायद वे से कोड कॉपीsys.sysindexkeys
मार्टिन स्मिथ

1
@ मर्टिन ओह, हाँ।
हारून बर्ट्रेंड

1
@AaronBertrand - और भी sys.selective_xml_index_paths, sys.xml_indexes, sys.sysindexesलेकिन मैं अगर जादुई संख्या अब मान्य नहीं है ये सिर्फ अपडेट कर दिया जाएगा लगता है।
मार्टिन स्मिथ

1
@ मैं इस पर शर्त नहीं लगाता। विशेष रूप से पिछड़े संगतता विचारों के लिए। प्रदर्शित करने के लिए क्या एक भयानक तरह से कैसे मेटाडाटा को पुनः प्राप्त करने ...
हारून बर्ट्रेंड

जवाबों:


17

यह इस गलत धारणा पर आधारित है कि एक्सएमएल इंडेक्स वर्तमान में एकमात्र प्रकार है जिसमें कभी भी एक आईडी स्कीम हो सकती है जो है = = 256000 (कम से कम उनके अवलोकन के आधार पर; यह योजना AFAIK को प्रलेखित नहीं है, इसलिए यह सुनिश्चित नहीं है कि यह जानबूझकर भी है)। वर्तमान संस्करणों में संभवतः ठीक है, लेकिन कौन जानता है कि किस प्रकार का सूचकांक अगले में जोड़ा जाएगा और इसकी आईडी योजना कहां शुरू होगी? यदि आप XML इंडेक्स को बाहर करना चाहते हैं, तो आप अब कुछ और को भी छोड़ रहे हैं। उदाहरण के लिए, स्थानिक सूचकांक, आईडी = 384000 पर शुरू होता है। यदि ऊपर दिए गए क्वेरी में स्थानिक सूचकांक शामिल हैं लेकिन XML इंडेक्स नहीं है, तो वे आश्चर्यचकित होने वाले हैं।

एक बेहतर फिल्टर होगा:

WHERE type <> 3;

... या इससे भी बेहतर, क्योंकि यह स्व-दस्तावेज है ...

WHERE type_desc <> N'XML';

और अब जब आप स्थानिक इंडेक्स भी कहना चाहते हैं, तो आपकी क्वेरी बदल जाती है ...

WHERE type_desc NOT IN (N'XML', N'SPATIAL');

... यह जानने के बजाय कि संख्यात्मक अनुक्रमिक के लिए आईडी मान किस सीमा तक व्याप्त हो सकते हैं (या नहीं)। उसके साथ अच्छा भाग्य।

ये स्पष्ट रूप से sys.indexes (Transact-SQL) में दर्ज़ हैं । मुझे इस जादू की संख्या का कोई संदर्भ नहीं दिखता है और मैं आपको अपने ट्यूटोरियल लेखक को यहाँ इंगित करने की अत्यधिक सलाह देता हूँ ताकि वे देख सकें कि यह जादू संख्या कुछ ऐसी नहीं है, जिस पर उन्हें भरोसा करना चाहिए (दूसरों पर भरोसा करने के लिए कभी भी मन नहीं लगाना चाहिए)।


4
+1 यह एक भयानक बुरी आदत है। के बारे में भूल जाओ index_id। विशेष रूप से चूंकि निर्धारित प्रकार के लिए अधिक सटीक डेटा इसके ठीक बगल में बैठे हैं ... शाब्दिक रूप से।
थॉमस स्ट्रिंगर

1
यह संभवतः इस नियमितता के साथ index_id को देने के लिए SQL सर्वर की डिज़ाइन त्रुटि है। उन्हें यादृच्छिक होना चाहिए ताकि कोई भी उन पर गलत भरोसा न कर सके।
usr

1

Kalen Delaney, Craig Freeman की पुस्तक "Microsoft SQL Server 2012 Internals" के अनुसार, XML इंडेक्स का index_id 256000 के साथ क्रमांकन करना शुरू कर देता है। इसलिए सभी प्रकार की इंडेक्स जानकारी (क्वेरी sys.indexes) प्राप्त करने के लिए - XML ​​इंडेक्स को छोड़ कर आप उस तरह से फ़िल्टर कर सकते हैं।

SELECT * FROM sys.indexes WHERE index_id <256000

Sys.indexes के टाइप कॉलम पर फ़िल्टर लगाकर समान परिणाम सेट प्राप्त किया जा सकता है। XML प्रकार के अनुक्रमित प्रकार के लिए = 3।

SELECT * FROM sys.indexes WHERE type <> 3

या

type_desc कॉलम का भी उपयोग किया जा सकता है।

SELECT * FROM sys.indexes WHERE type_desc <> 'XML'

1
क्या आपके पास इस दावे के लिए आधिकारिक दस्तावेज हैं?
स्वैसेक

मेरे पास यहीं है। कौन सा पेज? यह भी - मैं उन लेखकों से हट का सम्मान करता हूं, लेकिन मुझे यकीन नहीं है कि "आधिकारिक दस्तावेज" के रूप में गिना जाता है।
स्वैसेक

यह एक आकस्मिक अवलोकन है, सबसे अच्छा, कालेन द्वारा एक विशिष्ट बिंदु पर समय के साथ, बिना किसी ज्ञान के कि यह वास्तव में जानबूझकर था, कभी भी कोई नई सूचकांक प्रकार भविष्य में 256000 होगा यह निर्धारित करने की क्षमता नहीं है। यह ऐसा कुछ नहीं है जिसे Microsoft ने आप पर भरोसा करने के लिए कहा है, यही वजह है कि आपको आधिकारिक दस्तावेज में इसका कोई संदर्भ नहीं मिलेगा। और @swasheck से सहमत हैं, जबकि वह पुस्तक निश्चित रूप से एक मूल्यवान संसाधन है, यह आधिकारिक दस्तावेज नहीं है।
हारून बर्ट्रेंड

3
@swasheck का सवाल है कि, क्यों 256000 का उपयोग किया जाता है, और क्या सुरक्षित नहीं है। सर्वोत्तम अभ्यास के लिए निश्चित रूप से मैं हारून के साथ जाना
चाहूंगा

1
"यह क्या पूरा करता है?" तकनीकी रूप से उत्तर "कुछ भी नहीं" होगा। परिस्थितिवश, यह एक तरीका है कि लोगों ने एक्सएमएल इंडेक्स को छानने से संबंधित है।
स्वैसेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.