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 कार्य में स्टेजिंग तालिका का उपयोग करके डेटा के साथ अद्यतन किया गया था।
तीनों तालिका में पंक्तियों की संख्या खोजने के लिए पंक्ति गणना क्वेरी को फिर से चलाएं।
मुझे आशा है कि इससे आपको अपने समाधान को लागू करने का विचार मिलेगा।