2012-10-03 13 views
32

एसक्यूएल सर्वर 2012 की 900 बाइट इंडेक्स सीमा के लिए कुल वर्ण सीमा क्या है। मैंने एक कॉलम बनाया है जिसमें varchar(2000) है, लेकिन मुझे लगता है कि यह 900 बाइट से अधिक है जो SQL सर्वर सीमित है? 900 बाइट इंडेक्स कॉलम के अंदर फिट करने के लिए अधिकतम varchar(?) क्या होगा?900 बाइट इंडेक्स आकार सीमा में लंबाई सीमा

+0

शायद चरित्र सेट पर अपनी मेज –

+0

का उपयोग करता है सबसे छोटी वर्ण सेट मैं कभी इस्तेमाल किया चार प्रति 1 बाइट था निर्भर करता है। तुम्हारा अनुमान कम से कम इतना बड़ा है। – keyser

+0

यह एक SQL सर्वर 2012 64 बिट सॉफ्टवेयर है। चरित्र सेट के बारे में कुछ खास नहीं है। बस विंडोज 8 64 बिट बॉक्स के बाहर SQL सर्वर 2012 64 बिट चल रहा है। यूएस-इंग्लिश विंडोज़। – iefpw

उत्तर

47

भंडारण आकार varchar के लिए डेटा दर्ज किया + 2 बाइट्स की वास्तविक लंबाई है। भले ही कॉलम में 2 बाइट ओवरहेड है, फिर भी आप 900 byte वर्चर्स वैल्यू को एक कॉलम में डाल सकते हैं जो अनुक्रमित है।

अभ्यास में, आप एक सूचकांक एक स्तंभ पर आकार में बड़ा 900 से बाइट्स बना सकते हैं, लेकिन अगर आप वास्तव में डालने के लिए कुछ 900 बाइट से बड़ी कोशिश आप एक समस्या है:

create table test (
    col varchar(1000) 
); 
create index test_index on test (col); 
-- Warning! The maximum key length is 900 bytes. The index 'test_index' has maximum length of 1000 bytes. For some combination of large values, the insert/update operation will fail. 
insert into test select cast(replicate('x', 899) as varchar(1000)); -- Success 
insert into test select cast(replicate('y', 900) as varchar(1000)); -- Success 
insert into test select cast(replicate('z', 901) as varchar(1000)); -- Fail 
-- Msg 1946, Level 16, State 3, Line 8 
-- Operation failed. The index entry of length 901 bytes for the index 'test_index' exceeds the maximum length of 900 bytes. 
ध्यान रखें कि 900-बाइट सीमा किसी दिए गए सूचकांक कुंजी के सभी कॉलम शामिल हो

के रूप में इस उदाहरण से पता चलता:

create table test (
     col varchar(1000) 
    , otherCol bit -- This column will take a byte out of the index below, pun intended 
); 
create index test_index on test (col, otherCol); 
insert into test select cast(replicate('x', 899) as varchar(1000)), 0; -- Success 
insert into test select cast(replicate('y', 900) as varchar(1000)), 0; -- Fail 
insert into test select cast(replicate('z', 901) as varchar(1000)), 0; -- Fail 

इन स्तंभों कि सामान्य रूप से एक सूचकांक ke के लिए बहुत बड़ी हैं के लिए y, आप इंडेक्सिंग में including द्वारा इंडेक्सिंग के कुछ लाभ प्राप्त कर सकते हैं।

8

एक संबंधित नोट पर, एक विस्तृत विकल्प पर एक सूचकांक प्राप्त करने के लिए आप कोशिश कर सकते हैं कि एक और विकल्प, http://www.brentozar.com/archive/2013/05/indexing-wide-keys-in-sql-server/ पर उल्लिखित है, जहां तालिका में हैश कॉलम जोड़ा गया है और आपके प्रश्नों में उपयोग किया जाता है।

+2

मैंने 'हैशबेटी' फ़ंक्शन का बहुत प्रभावशाली उपयोग किया, धन्यवाद! ओपी SQLServer2012 पर चर्चा कर रहा था, लेकिन ध्यान दें कि 'SHA2_512' एल्गोरिदम केवल SQLServer2012 में पेश किया गया था, इसलिए यदि आप प्रारंभिक संस्करण का उपयोग कर रहे हैं तो आपको एक अलग एल्गोरिदम का उपयोग करना होगा, जैसा कि पिछले संस्करणों के लिए' SHA2_512' निर्दिष्ट करता है, केवल 'शून्य' देता है! यहां [2008 के लिए दस्तावेज़] [http://technet.microsoft.com/en-us/library/ms174415%28v=sql.100%29.aspx) है। उदाहरण के लिए: 'चयन HASHBYTES ('SHA2_512', 'जल्दी भूरी लोमड़ी') sha2_512 के रूप में, HASHBYTES md5 के रूप में ('MD5', 'जल्दी भूरी लोमड़ी'), HASHBYTES ('SHA1', 'जल्दी भूरी लोमड़ी') शाए 1 के रूप में। – DarthPablo

1

SQLServer 2016 को उन लोगों के लिए, सूचकांक कुंजी आकार 1700 बाइट्स तक बढ़ा दिया गया था .. What's new in Database Engine - SQL Server 2016

अधिकतम सूचकांक कुंजी आकार nonclustered अनुक्रमणिका 1700 बाइट्स तक बढ़ा दी गई है।

डेमो: (? लैटिन-8859)

create table test 
(
id varchar(800), 
id1 varchar(900) 
) 

insert into test 
select replicate('a',800),replicate('b',900) 

create index nci on test(id,id1) 
संबंधित मुद्दे