2010-12-07 16 views
31

के बजाय एनवार्चर (MAX) का उपयोग करके कोई प्रदर्शन हिट है, मुझे आश्चर्य है कि अगर यह एक छोटा (छोटा) अधिकतम आकार देने के बजाय प्रकार nvarchar (अधिकतम) के कॉलम को परिभाषित करने पर कोई नुकसान होता है ।एसक्यूएल प्रदर्शन: क्या एनवीरकर (200)

मैंने कहीं पढ़ा है कि यदि कॉलम मान 4 से अधिक है? KB शेष डेटा को "ओवरफ़्लो" क्षेत्र में जोड़ा जाएगा, जो ठीक है।

मैं एक टेबल बना रहा हूं जहां अधिकांश समय टेक्स्ट कुछ पंक्तियों का होगा, लेकिन मैं सोच रहा था कि निचली सीमा निर्धारित करने में कोई फायदा है और फिर उस सीमा को तोड़ने से बचने के लिए एक सत्यापन जोड़ना है।

क्या nvarchar (अधिकतम) कॉलम के साथ इंडेक्स के निर्माण पर कोई प्रतिबंध है, या आकार सीमा पर प्रतिबंध जोड़ने के लिए भुगतान करने वाली कोई भी चीज़ है?

धन्यवाद!

उत्तर

31

कड़ाई से MAX प्रकारों को बोलना हमेशा गैर-MAX प्रकारों की तुलना में थोड़ा धीमा होगा, Performance comparison of varchar(max) vs. varchar(N) देखें। लेकिन यह अंतर अभ्यास में कभी दिखाई नहीं देता है, जहां यह आईओ द्वारा संचालित समग्र प्रदर्शन में शोर बन जाता है।

आपकी मुख्य चिंता MAX बनाम गैर-MAX का प्रदर्शन नहीं होना चाहिए। आपको प्रश्न से चिंतित होना चाहिए यह संभव होगा कि इस कॉलम को 8000 से अधिक बाइट स्टोर करना होगा? यदि उत्तर हाँ है, यहां तक ​​कि यदि बहुत ही असंभव हां है, तो उत्तर स्पष्ट है: MAX प्रकार का उपयोग करें, इस कॉलम को बाद में MAX प्रकार में बदलने के लिए दर्द गैर-MAX के मामूली प्रदर्शन लाभ के लायक नहीं है प्रकार के।

अन्य चिंताओं (उस कॉलम को इंडेक्स करने की संभावना, MAX कॉलम वाले तालिकाओं के लिए ऑनलाइन इंडेक्स संचालन की अनुपलब्धता) को पहले से ही डेनिस के जवाब से संबोधित किया गया था।

बीटीडब्ल्यू, 4 केबी से अधिक कॉलम के बारे में जानकारी ओवरफ्लो क्षेत्र में शेष डेटा रखने के बारे में जानकारी गलत है। सही जानकारी Table and Index Organization में है:

ROW_OVERFLOW_DATA आवंटन यूनिट

एक मेज (ढेर या क्लस्टर टेबल), सूचकांक, या अनुक्रमित दृश्य द्वारा प्रयोग किया जाता हर विभाजन के लिए, वहाँ एक ROW_OVERFLOW_DATA आवंटन है इकाई। यह आवंटन इकाई शून्य (0) IN_ROW_DATA आवंटन इकाई में पृष्ठों चर लंबाई कॉलम (varchar, nvarchar, varbinary, या sql_variant) के साथ एक डेटा पंक्ति तक अधिक है 8 KB पंक्ति की आकार सीमा में शामिल है।जब आकार सीमा तक पहुंच जाती है, तो SQL Server कॉलम को उस पंक्ति से चौड़ाई के साथ ROW_OVERFLOW_DATA आवंटन इकाई में पृष्ठ पर ले जाता है। इस ऑफ-पंक्ति डेटा के लिए 24-बाइट पॉइंटर मूल पृष्ठ पर बनाए रखा जाता है।

तो 4KB से अधिक कॉलम नहीं है, पंक्तियां जो पृष्ठ पर खाली स्थान में फिट नहीं होती हैं, और 'शेष' नहीं है, संपूर्ण स्तंभ है।

+0

"एसक्यूएल 2012:।। आप ऐसा नहीं कर सकते ऑनलाइन सूचकांक विभाजन स्तर पर पुनर्निर्माण आप कर सकते हैं, हालांकि, ऑनलाइन सूचकांक पाठ को छोड़ कर सभी डेटा प्रकार के पूरे सूचकांक के पुनर्निर्माण करना, ntext, छवि इसका मतलब है कि varchar (max) के साथ टेबल, nvarchar (अधिकतम), और varbinary (अधिकतम) कॉलम ऑनलाइन एसक्यूएल में पुनर्निर्माण किया जा सकता 2012 एसक्यूएल 2014:। आप ऑनलाइन सूचकांक विभाजन स्तर पर पुनर्निर्माण कर सकते हैं कि आप ऑनलाइन सूचकांक varchar (max), nvarchar के पुनर्निर्माण कर सकते हैं (अधिकतम), और varbinary (अधिकतम) डेटा प्रकार। बस SQL ​​2012 के साथ, पाठ, ntext, छवि शामिल नहीं हैं। ये विरासत डेटा प्रकार हैं जो वास्तव में समय के साथ चरणबद्ध होना चाहिए। " – Triynko

16

900 बाइट्स से अधिक कॉलम पर एक अनुक्रमणिका नहीं बनाई जा सकती है। कॉलम कि बड़ी वस्तु (LOB) ntext डेटा प्रकार, पाठ, varchar(max), nvarchar (अधिकतम), varbinary (अधिकतम) के हैं, एक्सएमएल, या छवि कुंजी स्तंभों के रूप में एक सूचकांक

आप तथापि included columns उपयोग कर सकते हैं के लिए निर्दिष्ट नहीं किया जा सकता

पाठ, ntext, और छवि को छोड़कर सभी डेटा प्रकारों की अनुमति है। इंडेक्स को ऑफ़लाइन बनाया जाना चाहिए या ऑफ़लाइन बनाया जाना चाहिए (ONLINE = OFF) यदि निर्दिष्ट गैर-कुंजी कॉलम में से कोई भी वर्चर (अधिकतम), nvarchar (अधिकतम), या varbinary (अधिकतम) डेटा प्रकार हैं।

+0

बढ़िया! यही वह जानकारी है जिसे मैं ढूंढ रहा था। धन्यवाद – willvv

+1

+1। ऑनलाइन संचालन की अनुपलब्धता वास्तव में एक महत्वपूर्ण बात है: MAX कॉलम पेश करने से सभी ऑनलाइन संचालन अनुपलब्ध हो जाते हैं। –

+1

ऑनलाइन ऑपरेशन से आपका क्या मतलब है? – NickG

2

का चयन nvarchar (अधिकतम) भी कार्य योजना लागू करके अनुकूलन नहीं है जो SQL सर्वर इंजन द्वारा स्वचालित रूप से अनुकूलित कर रहे हैं प्रभावित कर सकते हैं।

+1

अगर 'प्रभावित' एक अच्छा या बुरा है, और हो सकता है कि संदर्भ दिखाए गए लिंक को जोड़ने के लायक हो। – TravisWhidden