Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

तालिका मूल्यवान कंस्ट्रक्टर चयन में अधिकतम पंक्तियों की सीमा

कोई प्रासंगिक हार्ड कोडित सीमा नहीं है (65,536 * 4KB का नेटवर्क पैकेट आकार 268 एमबी है और आपकी स्क्रिप्ट की लंबाई कहीं नहीं है) हालांकि बड़ी मात्रा में पंक्तियों के लिए इस पद्धति का उपयोग करना अनुचित है।

आप जो त्रुटि देख रहे हैं वह क्लाइंट टूल्स द्वारा SQL सर्वर नहीं है। यदि आप गतिशील SQL में SQL स्ट्रिंग का निर्माण करते हैं तो संकलन कम से कम सफलतापूर्वक प्रारंभ करने में सक्षम है

DECLARE @SQL NVARCHAR(MAX) = '(100,200,300),
';

SELECT @SQL = 'SELECT * FROM (VALUES ' + REPLICATE(@SQL, 1000000) + '
(100,200,300)) tc (proj_d, period_sid, val)';

SELECT @SQL AS [processing-instruction(x)]
FOR XML PATH('')

SELECT DATALENGTH(@SQL) / 1048576.0 AS [Length in MB] --30.517705917

EXEC(@SQL);

हालाँकि मैंने उपरोक्त को ~ 30 मिनट के संकलन समय के बाद मार दिया और इसने अभी भी एक पंक्ति का उत्पादन नहीं किया था। शाब्दिक मूल्यों को योजना के अंदर ही स्थिरांक की तालिका के रूप में संग्रहीत करने की आवश्यकता होती है और SQL सर्वर खर्च करता है बहुत समय उनके बारे में भी संपत्तियां निकालने का प्रयास कर रहे हैं।

SSMS एक 32 बिट अनुप्रयोग है और एक std::bad_alloc फेंकता है बैच को पार्स करते समय अपवाद

यह एक तत्व को टोकन के एक वेक्टर पर धकेलने की कोशिश करता है जो क्षमता तक पहुँच गया है और स्मृति के एक बड़े पर्याप्त सन्निहित क्षेत्र की अनुपलब्धता के कारण इसका आकार बदलने का प्रयास विफल हो जाता है। तो बयान कभी भी इसे सर्वर तक नहीं बनाता है।

वेक्टर क्षमता हर बार 50% बढ़ती है (अर्थात यहां अनुक्रम का पालन करते हुए ) वेक्टर को बढ़ने की क्षमता इस बात पर निर्भर करती है कि कोड कैसे निर्धारित किया जाता है।

निम्नलिखित को 19 की क्षमता से 28 तक बढ़ने की जरूरत है।

SELECT * FROM (VALUES (100,200,300),(100,200,300),(100,200,300),(100,200,300),(100,200,300),(100,200,300)) tc (proj_d, period_sid, val)

और निम्नलिखित को केवल 2 के आकार की आवश्यकता है

SELECT * FROM (VALUES (100,200,300),(100,200,300),(100,200,300),(100,200,300),(100,200,300),(100,200,300)) tc (proj_d, period_sid, val)

निम्नलिखित को> 63 और <=94 की क्षमता की आवश्यकता है।

SELECT *
FROM   (VALUES 
      (100,
       200,
       300),
      (100,
       200,
       300),
      (100,
       200,
       300),
      (100,
       200,
       300),
      (100,
       200,
       300),
      (100,
       200,
       300)
       ) tc (proj_d, period_sid, val) 

एक लाख पंक्तियों के लिए, जैसा कि 1 के मामले में है, वेक्टर क्षमता को बढ़ाकर 3,543,306 करने की आवश्यकता है।

आप पा सकते हैं कि निम्न में से कोई भी क्लाइंट साइड पार्सिंग को सफल होने देगा।

  1. लाइन ब्रेक की संख्या कम करें।
  2. एसएसएमएस को इस उम्मीद में फिर से शुरू करना कि बड़ी सन्निहित मेमोरी के लिए अनुरोध सफल हो जाता है जब कम पता स्थान विखंडन होता है।

हालाँकि, भले ही आप इसे सफलतापूर्वक सर्वर पर भेजते हैं, यह केवल निष्पादन योजना निर्माण के दौरान सर्वर को समाप्त कर देगा, जैसा कि ऊपर चर्चा की गई है।

आप तालिका लोड करने के लिए आयात निर्यात विज़ार्ड का उपयोग करने से बहुत बेहतर होंगे। यदि आपको इसे टीएसक्यूएल में करना है, तो आप इसे छोटे बैचों में तोड़ते हुए पाएंगे और/या किसी अन्य विधि का उपयोग कर सकते हैं जैसे कि एक्सएमएल को श्रेड करना टेबल वैल्यूड कंस्ट्रक्टर्स से बेहतर प्रदर्शन करेगा। निम्नलिखित उदाहरण के लिए मेरी मशीन पर 13 सेकंड में निष्पादित होता है (हालांकि यदि एसएसएमएस का उपयोग कर रहे हैं तो आपको एक बड़े एक्सएमएल स्ट्रिंग अक्षर को चिपकाने के बजाय कई बैचों में तोड़ना होगा)।

DECLARE @S NVARCHAR(MAX) = '<x proj_d="100" period_sid="200" val="300" />
' ; 

DECLARE @Xml XML = REPLICATE(@S,1000000);

SELECT 
    x.value('@proj_d','int'),
    x.value('@period_sid','int'),
    x.value('@val','int')
FROM @Xml.nodes('/x') c(x)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में VARCHAR और NVARCHAR डेटा प्रकार

  2. क्या MS SQL सर्वर के बीच में सीमा सीमाएँ शामिल हैं?

  3. System.Data.SqlClient.SqlException:उपयोगकर्ता के लिए लॉगिन विफल रहा

  4. Sproc . के भीतर से एक संग्रहित प्रक्रिया के कॉलर की पहचान कैसे करें

  5. एसक्यूएल ऑपरेशंस स्टूडियो (एसक्यूएलओपीएस) क्या है?