SQL सर्वर पर varchar (MAX) बनाम TEXT का उपयोग करना


195

मैंने अभी-अभी पढ़ा कि VARCHAR(MAX)डेटाटाइप (जो 2 जीबी के करीब डेटा को स्टोर कर सकता है) TEXTSQL सर्वर 2005 और नेक्स्ट SQL सर्वर संस्करणों में डेटाटाइप के लिए अनुशंसित प्रतिस्थापन है ।

अगर मैं किसी भी स्ट्रिंग के लिए कॉलम के अंदर खोजना चाहता हूं, तो कौन सा ऑपरेशन तेज है?

  1. LIKEएक VARCHAR(MAX)स्तंभ के खिलाफ एक खंड का उपयोग ?

    WHERE COL1 LIKE '%search string%'

  2. TEXTकॉलम का उपयोग करना और इस कॉलम पर एक पूर्ण टेक्स्ट इंडेक्स / कैटलॉग डालें , और फिर CONTAINSक्लॉज का उपयोग करके खोज करें ?

    WHERE CONTAINS (Col1, 'MyToken')


1
यह पोस्ट भी सहायक है: stackoverflow.com/questions/564755/…
जेक

25
उस पोस्ट में सबसे महत्वपूर्ण उल्लेख करने के लिए एक कड़ी है MSDN प्रलेखीकरण दिखा रहा है कि TEXTऔर NTEXT(और IMAGE) पदावनत कर रहे हैं।
ब्रायन

लिंक को देखें: stackoverflow.com/q/28980502/1805776
विक्की

जवाबों:


315

VARCHAR(MAX)प्रकार के लिए एक प्रतिस्थापन है TEXT। मूल अंतर यह है कि एक TEXTप्रकार हमेशा डेटा को ब्लॉब में संग्रहित करेगा जबकि VARCHAR(MAX)प्रकार सीधे डेटा को पंक्ति में संग्रहीत करने का प्रयास करेगा जब तक कि यह 8k सीमा से अधिक न हो और उस समय यह इसे बूँद में संग्रहीत करता है।

LIKE स्टेटमेंट का उपयोग करना दो डेटाटाइप्स के बीच समान है। अतिरिक्त कार्यक्षमता VARCHAR(MAX)आपको लगता है कि यह भी है के साथ इस्तेमाल किया जा सकता है देता है =और GROUP BYके रूप में किसी भी अन्य VARCHARस्तंभ हो सकता है। हालाँकि, यदि आपके पास बहुत अधिक डेटा है, तो आपके पास इन विधियों का उपयोग करके एक बहुत बड़ा प्रदर्शन होगा।

यदि आपको LIKEखोज करने के लिए उपयोग करना चाहिए , या यदि आप पूर्ण पाठ अनुक्रमण का उपयोग करें और CONTAINS। यह प्रश्न समान है VARCHAR(MAX)या नहीं TEXT

यदि आप बड़ी मात्रा में पाठ खोज रहे हैं और प्रदर्शन महत्वपूर्ण है तो आपको एक पूर्ण पाठ सूचकांक का उपयोग करना चाहिए ।

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


12
मुझे नहीं पता था कि यह पृष्ठ पर 8k में संग्रहीत होगा, और यदि बड़ा हो तो पृष्ठ से बाहर। बहुत ही शांत।
ब्रेन २२

3
आपकी अंतिम पंक्ति आंशिक रूप से गलत है। अगर वाइल्डकार्ड स्ट्रिंग की शुरुआत में खोजा जा रहा है तो LIKE इंडेक्स का उपयोग नहीं कर सकता है।
सौरव

1
क्या डेटा के साथ किसी मौजूदा तालिका से किसी पाठ को एक varchar (अधिकतम) में बदलना कोई समस्या नहीं है?
user1531040

17

बड़े पाठ के लिए, पूरा टेक्स्ट सूचकांक है बहुत तेजी से। लेकिन आप टेक्स्ट इंडेक्स varchar(max) को भी पूरा कर सकते हैं ।


16

आप किसी पाठ फ़ील्ड को पाठ से रूपांतरित किए बिना उसे खोज नहीं सकते।

declare @table table (a text)
insert into @table values ('a')
insert into @table values ('a')
insert into @table values ('b')
insert into @table values ('c')
insert into @table values ('d')


select *
from @table
where a ='a'

यह एक त्रुटि देता है:

The data types text and varchar are incompatible in the equal to operator.

यह नहीं है:

declare @table table (a varchar(max))

दिलचस्प है, LIKEअभी भी काम करता है, यानी

where a like '%a%'

11
रैंडम डाउनवोट कहने के लिए +1! मुझे पागल कर देता है जब लोग मुझे नीचा दिखाते हैं और कोई टिप्पणी नहीं करते हैं, उन्हें वास्तव में एक जीवन प्राप्त करने की आवश्यकता होती है।
टॉम स्टिकेल

3
इसका कारण यह है कि जो कुछ मुझे करना है, उसमें से जो मुझे याद है, वह यह है कि तकनीकी प्रश्न का उत्तर देते समय लाने के लिए एक वैध तर्क नहीं है। लोगों के बारे में सोचें (जैसे मैं अभी) इस बात का हवाला देने की कोशिश कर रहा हूं कि हमें इसका उपयोग क्यों करना चाहिए , varchar(n)या textइस उत्तर को प्राप्त करना चाहिए । क्या आपको लगता है, किसी व्यावसायिक क्षेत्र में, अस्पष्ट बयानों से बहस करने से समस्या को हल करने में मदद मिलेगी? StackOverflow पर सभी पोस्ट हजारों लोगों द्वारा देखे जाने, परिणामों में कार्य करने के लिए हैं!
अनवर

3
@Zeratops लोल, यह जवाब 6 साल पुराना है, जब मैंने इसे लिखा था, तो मैं हरे रंग का था। मैं बात करने के लिए और अधिक होने के लिए साफ कर दिया।
DForck42

9
  • मूल परिभाषा

TEXTऔर VarChar(MAX)नॉन-यूनिकोड बड़े वेरिएबल लेंथ कैरेक्टर डेटा टाइप हैं, जो अधिकतम 2147483647 नॉन-यूनिकोड कैरेक्टर (यानी अधिकतम स्टोरेज क्षमता: 2GB) स्टोर कर सकते हैं।

  • कौन सा उपयोग करें?

MSDN लिंक के अनुसार Microsoft पाठ डेटाटाइप का उपयोग करने से बचने का सुझाव दे रहा है और इसे Sql सर्वर के भविष्य के संस्करणों में हटा दिया जाएगा। Varchar (Max) पाठ डेटा प्रकार के बजाय बड़े स्ट्रिंग मानों को संग्रहीत करने के लिए सुझाया गया डेटा प्रकार है।

  • इन-रो या आउट-ऑफ-रो स्टोरेज

एक Textप्रकार के कॉलम का डेटा एक अलग LOB डेटा पृष्ठों में आउट-ऑफ-द-रो स्टोर किया जाता है। तालिका डेटा पृष्ठ में पंक्ति में LOB डेटा पृष्ठ पर केवल 16 बाइट पॉइंटर होगा जहां वास्तविक डेटा मौजूद है। जबकि एक Varchar(max)प्रकार के कॉलम का डेटा इन-रो में संग्रहीत किया जाता है यदि यह 8000 बाइट से कम या बराबर है। यदि Varchar (अधिकतम) कॉलम वैल्यू 8000 बाइट्स को पार कर रहा है तो Varchar (मैक्सिमम) कॉलम वैल्यू को एक अलग LOB डेटा पेजों में संग्रहित किया जाता है और पंक्ति में LOB डेटा पेज पर केवल 16 बाइट पॉइंटर होगा जहां वास्तविक डेटा मौजूद है। इसलिए In-Rowवरचर (अधिकतम) खोजों और पुनर्प्राप्ति के लिए अच्छा है।

  • समर्थित / असमर्थित कार्यशीलता

कुछ स्ट्रिंग फ़ंक्शंस, ऑपरेटर्स या कंस्ट्रक्ट्स जो टेक्स्ट टाइप कॉलम पर काम नहीं करते हैं, लेकिन वे वर्कर (मैक्स) टाइप कॉलम पर काम करते हैं।

  1. = वर्कर (मैक्स) टाइप कॉलम पर ऑपरेटर के बराबर
  2. वर्कर (अधिकतम) प्रकार के कॉलम पर समूह द्वारा समूह

    • सिस्टम IO विचार

जैसा कि हम जानते हैं कि VarChar (Max) प्रकार के कॉलम मान केवल पंक्ति से बाहर संग्रहीत किए जाते हैं, यदि इसमें संग्रहीत किए जाने वाले मूल्य की लंबाई 8000 बाइट्स से अधिक हो या पंक्ति में पर्याप्त स्थान न हो, अन्यथा यह स्टोर हो जाएगा यह पंक्ति में है। इसलिए यदि वार्चर (अधिकतम) कॉलम में संग्रहीत अधिकांश मान बड़े और संग्रहीत आउट-ऑफ-रो हैं, तो डेटा पुनर्प्राप्ति व्यवहार लगभग पाठ प्रकार के स्तंभ के समान होगा।

लेकिन अगर वर्कर (अधिकतम) प्रकार के स्तंभों में संग्रहीत अधिकांश मान पंक्ति में संग्रहीत करने के लिए पर्याप्त छोटे हैं। फिर डेटा की पुनर्प्राप्ति जहां एलओबी कॉलम शामिल नहीं हैं, वहां पढ़ने के लिए अधिक संख्या में डेटा पृष्ठों की आवश्यकता होती है क्योंकि एलओबी कॉलम मूल्य को उसी डेटा पृष्ठ में पंक्ति में संग्रहीत किया जाता है जहां गैर-एलओबी कॉलम मान संग्रहीत होते हैं। लेकिन यदि चयनित क्वेरी में LOB कॉलम शामिल है, तो पाठ प्रकार के कॉलम की तुलना में डेटा पुनर्प्राप्ति के लिए पढ़ने के लिए कम पृष्ठों की आवश्यकता होती है।

निष्कर्ष

अच्छे प्रदर्शन के VarChar(MAX)बजाय डेटा प्रकार का उपयोग करें TEXT

स्रोत


5

यदि MS Access (विशेष रूप से 2003 जैसे पुराने संस्करण) का उपयोग कर रहे हैं, तो आप TEXTSQL सर्वर पर डेटाटाइप का उपयोग करने के लिए मजबूर होते हैं क्योंकि MS Access एक्सेस nvarchar(MAX)में मेमो फ़ील्ड के रूप में नहीं पहचानता है , जबकि TEXTमेमो-फ़ील्ड के रूप में पहचाना जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.