मैं यहाँ एक और उत्तर जोड़ने में संकोच कर रहा हूँ क्योंकि पहले से ही काफी कुछ हैं, लेकिन कुछ बिंदुओं को बनाने की आवश्यकता है जो या तो स्पष्ट नहीं किए गए हैं या स्पष्ट नहीं किए गए हैं।
पहली: क्या नहीं हमेशा उपयोग NVARCHAR
। यह एक बहुत ही खतरनाक है, और अक्सर महंगा, दृष्टिकोण / दृष्टिकोण है। और यह कहना बेहतर नहीं है कि " कभी भी कर्सर का उपयोग न करें" क्योंकि वे कभी-कभी किसी विशेष समस्या को हल करने का सबसे कुशल साधन होते हैं, और एक WHILE
लूप करने के आम काम-के आसपास लगभग हमेशा एक ठीक से किए गए कर्सर की तुलना में धीमा होगा ।
"हमेशा" शब्द का उपयोग करने का एकमात्र समय तब होता है जब "हमेशा वही करें जो स्थिति के लिए सबसे अच्छा हो" की सलाह दे। यह निर्धारित करना कि अक्सर निर्धारित करना मुश्किल होता है, खासकर जब विकास के समय में अल्पकालिक लाभ को संतुलित करने की कोशिश कर रहे हैं (प्रबंधक: "हमें इस सुविधा की आवश्यकता है - जो आपको अभी तक पता नहीं था - एक सप्ताह पहले!") लंबे समय के साथ -टर्म रखरखाव लागत (प्रबंधक, जिन्होंने शुरू में टीम को 3-सप्ताह के स्प्रिंट में 3 महीने की परियोजना को पूरा करने के लिए दबाव डाला था: "हम इन प्रदर्शन समस्याओं को क्यों कर रहे हैं? हम संभवतः एक्स को कैसे कर सकते हैं जिसमें कोई लचीलापन नहीं है? हम बर्दाश्त नहीं कर सकते हैं?" एक स्प्रिंट या दो इसे ठीक करने के लिए। हम एक सप्ताह में क्या कर सकते हैं ताकि हम अपनी प्राथमिकता वाली वस्तुओं को वापस पा सकें? और हमें निश्चित रूप से डिजाइन में अधिक समय बिताने की जरूरत है ताकि ऐसा न हो। ")।
दूसरा: @ gbn का जवाब कुछ महत्वपूर्ण बिंदुओं पर विचार करता है जब कुछ डेटा मॉडलिंग निर्णय लेते समय पथ 100% स्पष्ट नहीं होता है। लेकिन विचार करने के लिए और भी बहुत कुछ है:
- लेन-देन लॉग फ़ाइलों का आकार
- दोहराने में समय लगता है (यदि प्रतिकृति का उपयोग कर)
- ईटीएल में समय लगता है (यदि ETLing)
- किसी दूरस्थ सिस्टम में लॉग को शिप करने में समय लगता है और पुनर्स्थापित (यदि लॉग शिपिंग का उपयोग कर रहा है)
- बैकअप का आकार
- बैकअप पूरा करने में समय की लंबाई है
- एक पुनर्स्थापना करने में समय की लंबाई है (यह किसी दिन महत्वपूर्ण हो सकता है ;-)
- tempdb के लिए आवश्यक आकार
- ट्रिगर्स का प्रदर्शन (सम्मिलित और हटाए गए तालिकाओं के लिए जो टेम्पर्ड में संग्रहीत हैं)
- पंक्ति संस्करण का प्रदर्शन (यदि स्नैपशॉट का उपयोग कर रहा है, क्योंकि संस्करण स्टोर टेम्पर्ड में है)
- नई डिस्क स्थान प्राप्त करने की क्षमता जब सीएफओ का कहना है कि उन्होंने पिछले साल सैन पर $ 1 मिलियन खर्च किए थे और इसलिए वे अतिरिक्त भंडारण के लिए $ 250k को अधिकृत नहीं करेंगे
- INSERT और UPDATE परिचालनों को करने में लंबा समय लगता है
- सूचकांक अनुरक्षण करने में समय की लंबाई
- आदि, आदि।
पूरे सिस्टम पर अंतरिक्ष बर्बाद करने का बहुत बड़ा प्रभाव है। मैंने इस विषय पर स्पष्ट विवरण में एक लेख लिखा: डिस्क इज़ सस्ता! औरली? (मुफ्त पंजीकरण की आवश्यकता है, क्षमा करें, मैं उस नीति को नियंत्रित नहीं करता हूं)।
तीसरा: जबकि कुछ उत्तर गलत तरीके से "यह एक छोटा सा ऐप है" पहलू पर ध्यान केंद्रित कर रहे हैं, और कुछ सही ढंग से "उपयोग करने के लिए उपयुक्त है" का सुझाव दे रहे हैं, किसी भी उत्तर ने ओपी को वास्तविक मार्गदर्शन प्रदान नहीं किया है। प्रश्न में वर्णित एक महत्वपूर्ण विवरण यह है कि यह उनके स्कूल के लिए एक वेब पेज है। महान! तो हम सुझाव दे सकते हैं कि:
- छात्र और / या संकाय नाम के लिए फील्ड्स चाहिए शायद हो
NVARCHAR
, क्योंकि समय के साथ, यह केवल अधिक संभावना है कि अन्य संस्कृतियों से नाम उन स्थानों में प्रदर्शित किया जाएगा हो रही है।
- लेकिन सड़क के पते और शहर के नाम के लिए? एप्लिकेशन का उद्देश्य नहीं बताया गया था (यह उपयोगी होगा) लेकिन पते के रिकॉर्ड को मानते हुए, यदि कोई है, तो किसी विशेष भौगोलिक क्षेत्र (यानी एकल भाषा / संस्कृति) से संबंधित है, तो
VARCHAR
उपयुक्त कोड पृष्ठ (जिसका उपयोग करें) क्षेत्र के Collation से निर्धारित होता है)।
- यदि स्टेट्स और / या देश के ISO कोड्स को स्टोर करना है
INT
( TINYINT
क्योंकि ISO कोड्स को स्टोर करने की जरूरत नहीं है / तय की गई है, तो मानव पठनीय और अच्छी तरह से, मानक :) CHAR(2)
दो अक्षर कोड के लिए उपयोग करते हैं और CHAR(3)
यदि 3 अक्षर कोड का उपयोग करते हैं। और जैसे कि एक बाइनरी कोलेशन का उपयोग करने पर विचार करें Latin1_General_100_BIN2
।
- यदि पोस्टल कोड (यानी ज़िप कोड) को संग्रहीत
VARCHAR
किया जाता है , तो इसका उपयोग करें क्योंकि यह एक अंतरराष्ट्रीय मानक है जो AZ के बाहर किसी भी पत्र का उपयोग नहीं करता है। और हां, अभी भी उपयोग करें, VARCHAR
भले ही केवल यूएस पिन कोड स्टोर करें और न कि INT क्योंकि ज़िप कोड नंबर नहीं हैं, वे तार हैं, और उनमें से कुछ में एक अग्रणी "0" है। और जैसे कि एक बाइनरी कोलेशन का उपयोग करने पर विचार करें Latin1_General_100_BIN2
।
- यदि ईमेल पते और / या URL संग्रहीत करते हैं, तो
NVARCHAR
उन दोनों का उपयोग करें, जिनमें अब यूनिकोड वर्ण हो सकते हैं।
- और इसी तरह....
चौथा: अब जब आपके पास NVARCHAR
डेटा की तुलना में दोगुना स्थान लेने की आवश्यकता है, तो इसके लिए डेटा की आवश्यकता होती है, जो अच्छी तरह से फिट बैठता है VARCHAR
("अच्छी तरह से फिट बैठता है" = "में बदल नहीं जाता है?") और किसी भी तरह, जैसे कि जादू से, आवेदन बढ़ता था? और अब इनमें से कम से कम एक क्षेत्र में लाखों रिकॉर्ड हैं जहां अधिकांश पंक्तियां मानक ASCII हैं, लेकिन कुछ में यूनिकोड वर्ण हैं, इसलिए आपको NVARCHAR
निम्नलिखित पर विचार करना होगा:
यदि आप SQL Server 2008 - 2016 RTM का उपयोग कर रहे हैं और एंटरप्राइज़ संस्करण पर हैं, या यदि SQL सर्वर 2016 SP1 (जिसने सभी संस्करणों में डेटा संपीड़न उपलब्ध कराया है) या नए का उपयोग कर रहे हैं, तो आप डेटा संपीड़न को सक्षम कर सकते हैं । डेटा संपीड़न (और "हमेशा" नहीं होगा) यूनिकोड डेटा को NCHAR
और NVARCHAR
फ़ील्ड में संपीड़ित करता है । निर्धारण कारक हैं:
NCHAR(1 - 4000)
और यूनिकोड के लिए मानक संपीड़न योजना काNVARCHAR(1 - 4000)
उपयोग करें , लेकिन केवल SQL Server 2008 R2 में शुरू हो रहा है, और केवल ROW डेटा के लिए, OVERFLOW नहीं! यह नियमित ROW / PAGE कम्प्रेशन एल्गोरिदम से बेहतर प्रतीत होता है।
NVARCHAR(MAX)
और XML
(और मैं भी लगता है VARBINARY(MAX)
, TEXT
और NTEXT
) डेटा में पंक्ति में कम से कम पृष्ठ संकुचित किया जा सकता है, लेकिन (LOB या अतिप्रवाह पृष्ठों में पंक्ति बंद नहीं) है कि नहीं संकुचित पंक्ति। बेशक, पृष्ठ संपीड़न इन-पंक्ति मान के आकार पर निर्भर करता है: मैंने VARCHAR (MAX) के साथ परीक्षण किया और देखा कि 6000 वर्ण / बाइट पंक्तियाँ संपीड़ित नहीं होंगी, लेकिन 4000 वर्ण / बाइट पंक्तियों ने किया।
- कोई भी ROW डेटा, LOB या OVERLOW = आपके लिए कोई संपीड़न नहीं!
यदि SQL Server 2005, या 2008 - 2016 RTM और एंटरप्राइज़ संस्करण पर नहीं , तो आपके पास दो फ़ील्ड हो सकते हैं: एक VARCHAR
और एक NVARCHAR
। उदाहरण के लिए, मान लें कि आप ऐसे URL संग्रहीत कर रहे हैं जो अधिकतर सभी ASCII वर्ण (मान 0 - 127) हैं और इसलिए इसमें फिट हैं VARCHAR
, लेकिन कभी-कभी यूनिकोड वर्ण होते हैं। आपके स्कीमा में निम्नलिखित 3 फ़ील्ड शामिल हो सकते हैं:
...
URLa VARCHAR(2048) NULL,
URLu NVARCHAR(2048) NULL,
URL AS (ISNULL(CONVERT(NVARCHAR([URLa])), [URLu])),
CONSTRAINT [CK_TableName_OneUrlMax] CHECK (
([URLa] IS NOT NULL OR [URLu] IS NOT NULL)
AND ([URLa] IS NULL OR [URLu] IS NULL))
);
इस मॉडल में आप केवल[URL]
गणना किए गए कॉलम से चयन करें। डालने और अद्यतन करने के लिए, आप यह निर्धारित करते हैं कि कौन से फ़ील्ड का उपयोग करके देखें कि क्या आने वाले मूल्य को परिवर्तित करता है, जो कि NVARCHAR
प्रकार का है:
INSERT INTO TableName (..., URLa, URLu)
VALUES (...,
IIF (CONVERT(VARCHAR(2048), @URL) = @URL, @URL, NULL),
IIF (CONVERT(VARCHAR(2048), @URL) <> @URL, NULL, @URL)
);
आप आने वाले मानों को GZIP में बदल सकते हैं VARBINARY(MAX)
और फिर बाहर निकलने पर अनज़िप कर सकते हैं:
- SQL Server 2005 - 2014 के लिए: आप SQLCLR का उपयोग कर सकते हैं। SQL # (एक SQLCLR लाइब्रेरी जो मैंने लिखी है) Util_GZip और Util_GUnzip के साथ मुफ़्त संस्करण में आती है
- SQL सर्वर 2016 और नए के लिए: आप अंतर्निहित
COMPRESS
और DECOMPRESS
फ़ंक्शंस का उपयोग कर सकते हैं , जो कि GZip भी हैं।
यदि SQL Server 2017 या नए का उपयोग कर रहे हैं, तो आप तालिका को एक Clustered Columnstore Index बनाने में देख सकते हैं।
हालांकि यह एक व्यवहार्य विकल्प नहीं है, लेकिन SQL Server 2019 UTF-8 VARCHAR
/ CHAR
datatypes के लिए मूल समर्थन का परिचय देता है । इसका उपयोग करने के लिए वर्तमान में इसके साथ बहुत सारे कीड़े हैं, लेकिन यदि वे तय हो गए हैं, तो यह कुछ परिदृश्यों के लिए एक विकल्प है। इस नई सुविधा के विस्तृत विश्लेषण के लिए कृपया मेरी पोस्ट, " मूल निवासी UTF-8 SQL Server 2019 में समर्थन: उद्धारकर्ता या गलत पैगंबर? " देखें।