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

मैं एसएसआईएस पैकेज के भीतर अप्सर्ट (अपडेट और इंसर्ट) ऑपरेशन को कैसे अनुकूलित करूं?

SSIS 2008 R2 का उपयोग कर नमूना पैकेज जो बैच ऑपरेशन का उपयोग करके सम्मिलित या अपडेट करता है:

यहां SSIS 2008 R2 में लिखा गया एक नमूना पैकेज है जो बताता है कि बैच संचालन का उपयोग करके दो डेटाबेस के बीच इंसर्ट, अपडेट कैसे करें।

  • OLE DB Command का उपयोग करना आपके पैकेज पर अपडेट संचालन को धीमा कर देगा क्योंकि यह नहीं करता है बैच संचालन करें। प्रत्येक पंक्ति व्यक्तिगत रूप से अपडेट की जाती है।

नमूना दो डेटाबेस का उपयोग करता है जिसका नाम है Source और Destination . मेरे उदाहरण में, दोनों डेटाबेस सर्वर पर रहते हैं लेकिन तर्क अभी भी विभिन्न सर्वरों और स्थानों पर रहने वाले डेटाबेस के लिए लागू किया जा सकता है।

मैंने dbo.SourceTable . नाम की एक टेबल बनाई है मेरे स्रोत डेटाबेस में Source

CREATE TABLE [dbo].[SourceTable](
    [RowNumber] [bigint] NOT NULL,
    [CreatedOn] [datetime] NOT NULL,
    [ModifiedOn] [datetime] NOT NULL,
    [IsActive] [bit] NULL
)

साथ ही, dbo.DestinationTable . नाम की दो टेबल बनाईं और dbo.StagingTable मेरे गंतव्य डेटाबेस में Destination

CREATE TABLE [dbo].[DestinationTable](
    [RowNumber] [bigint] NOT NULL,
    [CreatedOn] [datetime] NOT NULL,
    [ModifiedOn] [datetime] NOT NULL
) 
GO

CREATE TABLE [dbo].[StagingTable](
    [RowNumber] [bigint] NOT NULL,
    [CreatedOn] [datetime] NOT NULL,
    [ModifiedOn] [datetime] NOT NULL
) 
GO

तालिका में लगभग 1.4 मिलियन पंक्तियाँ सम्मिलित की गईं dbo.SourceTable RowNumber . में अद्वितीय मानों के साथ कॉलम। टेबल dbo.DestinationTable और dbo.StagingTable शुरू करने के लिए खाली थे। तालिका में सभी पंक्तियां dbo.SourceTable झंडा है IsActive असत्य पर सेट करें।

दो OLE DB कनेक्शन प्रबंधकों के साथ एक SSIS पैकेज बनाया, प्रत्येक Source . से कनेक्ट हो रहा है और Destination डेटाबेस। नियंत्रण प्रवाह को नीचे दिखाए अनुसार डिज़ाइन किया गया:

  • पहले Execute SQL Task कथन निष्पादित करता है TRUNCATE TABLE dbo.StagingTable स्टेजिंग टेबल को छोटा करने के लिए गंतव्य डेटाबेस के विरुद्ध।

  • अगला खंड बताता है कि कैसे Data Flow Task कॉन्फ़िगर किया गया है।

  • दूसरा Execute SQL Task नीचे दिए गए SQL स्टेटमेंट को निष्पादित करता है जो डेटा को dbo.DestinationTable . में अपडेट करता है dbo.StagingTable . में उपलब्ध डेटा का उपयोग करना , यह मानते हुए कि उन दो तालिकाओं के बीच मेल खाने वाली एक अनूठी कुंजी है। इस मामले में, अद्वितीय कुंजी कॉलम है RowNumber

अद्यतन करने के लिए स्क्रिप्ट:

UPDATE      D 
SET         D.CreatedOn = S.CreatedOn
        ,   D.ModifiedOn = S.ModifiedOn 
FROM        dbo.DestinationTable D 
INNER JOIN  dbo.StagingTable S 
ON          D.RowNumber = S.RowNumber

जैसा कि नीचे दिखाया गया है, मैंने डेटा प्रवाह कार्य को डिज़ाइन किया है।

  • OLE DB Source dbo.SourceTable . से डेटा पढ़ता है SQL कमांड का उपयोग करते हुए SELECT RowNumber,CreatedOn, ModifiedOn FROM Source.dbo.SourceTable WHERE IsActive = 1 है

  • Lookup transformation यह जांचने के लिए प्रयोग किया जाता है कि क्या RowNumber मान पहले से तालिका में मौजूद है dbo.DestinationTable

  • अगर रिकॉर्ड नहीं मौजूद है, इसे OLE DB Destination . पर पुनर्निर्देशित किया जाएगा नाम दिया गया है Insert into destination table , जो पंक्ति को dbo.DestinationTable . में सम्मिलित करता है

  • अगर रिकॉर्ड मौजूद है , इसे OLE DB Destination . पर पुनर्निर्देशित किया जाएगा Insert into staging table . नाम दिया गया है , जो पंक्ति को dbo.StagingTable . में सम्मिलित करता है . स्टेजिंग टेबल में इस डेटा का उपयोग दूसरे `निष्पादित SQL कार्य बैच अपडेट करने के लिए किया जाएगा।

OLE DB स्रोत के लिए कुछ और पंक्तियों को सक्रिय करने के लिए, मैंने कुछ रिकॉर्ड सक्रिय करने के लिए निम्न क्वेरी चलाई

UPDATE  dbo.SourceTable 
SET     IsActive = 1 
WHERE   (RowNumber % 9 = 1) 
OR      (RowNumber % 9 = 2)

पैकेज का पहला निष्पादन नीचे दिखाया गया है। सभी पंक्तियों को गंतव्य तालिका में निर्देशित किया गया था क्योंकि यह खाली था। मेरी मशीन पर पैकेज के निष्पादन में लगभग 3 seconds का समय लगा ।

तीनों तालिका में पंक्तियों की संख्या खोजने के लिए पंक्ति गणना क्वेरी को फिर से चलाएं।

OLE DB स्रोत के लिए कुछ और पंक्तियों को सक्रिय करने के लिए, मैंने कुछ रिकॉर्ड सक्रिय करने के लिए निम्न क्वेरी चलाई

UPDATE  dbo.SourceTable 
SET     IsActive = 1 
WHERE   (RowNumber % 9 = 3) 
OR      (RowNumber % 9 = 5) 
OR      (RowNumber % 9 = 6) 
OR      (RowNumber % 9 = 7)

पैकेज का दूसरा निष्पादन नीचे दिखाया गया है। 314,268 rows जो पहले पहले निष्पादन के दौरान डाले गए थे उन्हें स्टेजिंग टेबल पर पुनर्निर्देशित किया गया था। 628,766 new rows सीधे गंतव्य तालिका में डाले गए थे। मेरी मशीन पर पैकेज के निष्पादन में लगभग 12 seconds का समय लगा . 314,268 rows गंतव्य तालिका में दूसरे निष्पादन SQL कार्य में स्टेजिंग तालिका का उपयोग करके डेटा के साथ अद्यतन किया गया था।

तीनों तालिका में पंक्तियों की संख्या खोजने के लिए पंक्ति गणना क्वेरी को फिर से चलाएं।

मुझे आशा है कि इससे आपको अपने समाधान को लागू करने का विचार मिलेगा।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. हिजरी को ग्रेगोरियन तिथि में बदलने के लिए एसक्यूएल सर्वर कन्वर्ट फ़ंक्शन का उपयोग करें

  2. SQL तालिका में टेक्स्ट स्ट्रिंग में लाइन ब्रेक ढूँढना?

  3. CONCAT(कॉलम) ओवर(पार्टिशन बाय...)? परिणाम को समूहीकृत किए बिना समूह-संगत पंक्तियाँ

  4. मुझे एक टेबल नाम को संग्रहीत प्रो में कैसे पास करना चाहिए?

  5. SQL सर्वर पर संग्रहीत कार्यविधि का अनुसूचित रन