SQL सर्वर - प्राथमिक कुंजी के बिना बड़ी तालिका निर्यात करें


9

मुझे SQL सर्वर और MySQL के बीच एक प्राथमिक कुंजी के बिना एक बड़ी तालिका ~ 500 लाखों पंक्तियों को सिंक करने की आवश्यकता है। तालिका में केवल एक संकुल मिश्रित गैर-अद्वितीय सूचकांक है।

मेरे पास सर्वरों के बीच ODBC कनेक्शन है, लेकिन ~ 8 मिलियन पंक्तियों के आयात में लगभग 45 मिनट लगते हैं, इसलिए मेरा मानना ​​है कि एक बड़ा एकल आयात अनुचित होगा क्योंकि किसी भी बिंदु पर रुकावट हो सकती है। मैं मौजूदा तालिका संरचना को नहीं बदल सकता, मैं अन्य तालिकाओं को जोड़ सकता हूं। आगे पढ़ने के बाद, ऑफसेट / भ्रूण बड़ी तालिकाओं के लिए एक विकल्प नहीं है। "Select ... जहाँ x बीच ... और ..." एक विकल्प नहीं है क्योंकि मेरे पास एक अद्वितीय कुंजी नहीं है।

मैं उन पंक्तियों में तालिका को कैसे निर्यात कर सकता हूं जिनकी सभी पंक्तियों को शामिल करने की गारंटी है? मेरी समस्या यह है कि चूंकि गुच्छेदार कुंजी अद्वितीय नहीं है, इसलिए यह सुनिश्चित करने के बाद कि भौतिक पंक्तियों की गारंटी नहीं है, निरंतर प्रश्नों के बीच एक ही क्रम है और सभी स्तंभों को बहुत लंबा होने के बाद ऑर्डर करना होगा। और आप ODBC या CSV फ़ाइलों के माध्यम से बैचों को स्थानांतरित करने की अनुशंसा कैसे करेंगे?


यह दोहराई जाएगी (ususal ऑपरेशन) या वन टाइम ऑपरेशन?
बोगदान बोगदानोव

प्रारंभिक निर्यात एक बार का ऑपरेशन होगा, नए रिकॉर्ड या अपडेट जैसे सिंक परिवर्तन दोहराए जाने चाहिए। सीडीसी एक विकल्प नहीं है, लेकिन प्रारंभिक प्रवास के बाद आगे की जांच करेगा।
कोई

मुझे लगता है कि इस पर सहायता प्राप्त करने के लिए आपको अधिक विवरण में पूरी प्रक्रिया को समझाना होगा (यह आपको बहुत जटिल समस्या दिखती है)
Bogdan Bogdanov

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

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

जवाबों:


0

मान लें कि आपके पास स्रोत तालिका के विरुद्ध अपडेट या डिलीट नहीं हैं, तो आप निम्नलिखित प्रयास कर सकते हैं:
1. CTAS सिंटैक्स (SQLServer के लिए SELECT * into source_table_copy FROM source_table) का उपयोग करके मौजूदा तालिका की एक प्रतिलिपि बनाएँ । विशाल तालिकाओं के लिए भी इस तरह का ऑपरेशन बहुत तेज है।
2. उस after insertपर ट्रिगर जोड़ें source_tableनई प्रतियां [s] करने के लिए प्रतियां source_table_copy
3. अब जब सभी नए रिकॉर्ड के रूप में अच्छी तरह source_tableसे जाना है source_table_copy, और आप कॉपी किए गए टेबल से बैचों में Mysql के लिए डेटा स्थानांतरित कर सकते हैं। उदाहरण के लिए, यदि आपके पास 2 सर्वरों के बीच एक लिंक है, तो सब कुछ TSQL संग्रहीत कार्यविधि के शरीर के भीतर किया जा सकता है।
उदाहरण के लिए नए सर्वर पर 20 रिकॉर्ड तक जाने वाले कोड का एक टुकड़ा लग सकता है

 --declare table variable to keep deleted records until they delivered to target host 
  BEGIN TRANSACTION;
  DELETE TOP (20) FROM source_table_copy OUTPUT DELETED.* INTO @Table_Var;

  --insert data into linked server , or to csv file
  COMMIT; 

डेटा को पढ़ने और फिर where current ofक्लॉज़ से हटाने के लिए CURSOR का उपयोग करना संभव है ।

** आदर्श रूप से आपको एप्लिकेशन को डेटा डालने से रोकने की आवश्यकता है source_table चरण 1 । यदि यह बिल्कुल असंभव है, तो मैं एक after insertट्रिगर के साथ जाऊंगा जो चरण 1 से ठीक पहले जोड़ा गया है और इसे ठीक करने के बाद हटा दिया गया है जो डेटा को किसी अन्य तालिका में कॉपी कर सकता है। बाद में साथ विलय source_table_copy


समाधान के लिए धन्यवाद, मैं कुछ भी कोशिश कर रहा था, हालांकि एक सामान्य आवेषण के साथ। मैं सीटीएएस सिंटैक्स को देखने की कोशिश करूंगा कि क्या यह चीजों को गति देता है। फॉलोअप सवाल, अगर आपको कोई आपत्ति नहीं है: तो "इंसर्ट ट्रिगर के बाद" प्रदर्शन को प्रभावित करेगा?
कोई नहीं

चूंकि ट्रिगर बॉडी बहुत सरल है (बस किसी अन्य तालिका में डेटा डालें), प्रदर्शन प्रभाव न्यूनतम होगा।
a1ex07
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.