कौन सा अधिक कुशल है: लिंक्ड सर्वर से चुनें या लिंक्ड सर्वर में डालें?


32

मान लीजिए कि मुझे एक सर्वर से दूसरे (लिंक किए गए सर्वर के माध्यम से) डेटा निर्यात करना है। कौन सा कथन अधिक कुशल होगा?

स्रोत सर्वर में निष्पादन:

INSERT INTO [DestinationLinkedServer].[DestinationDB].[dbo].[Table]
SELECT a, b, c, ... FROM [dbo].Udf_GetExportData()

या लक्ष्य सर्वर में निष्पादित:

INSERT INTO [dbo].[Table]
SELECT a, b, c, ...
FROM OPENQUERY([OriginLinkedServer],
    'SELECT a, b, c, ... FROM [OriginDB].[dbo].Udf_GetExportData()')

कौन सा तेज होगा और कुल (स्रोत और लक्ष्य सर्वर दोनों) में कम रिसोर्स का उपभोग करेगा? दोनों सर्वर SQL Server 2005 हैं।

जवाबों:


29

मान लीजिए मुझे एक सर्वर से दूसरे में डेटा निर्यात करना है।

सबसे अच्छा उपयोग करना है

  • यदि आप चाहते हैं कि सभी डेटा बैकअप / पुनर्स्थापना का उपयोग करें; BCP OUT और BCP IN या SSIS
  • यदि आप डेटा का सबसेट (केवल कुछ टेबल) चाहते हैं तो SSIS या BCP OUT और BCP IN का उपयोग करें

डेटा को स्थानांतरित करने के लिए, डेटा की मात्रा / आकार और n / w बैंडविड्थ के आधार पर, लिंक्ड सर्वर प्रदर्शन को मार देगा।

स्रोत सर्वर में निष्पादन या लक्ष्य सर्वर में निष्पादित - कौन सा तेज़ होगा और कुल (दोनों स्रोत और लक्ष्य दोनों) में कम रिसोर्स का उपभोग करेगा?

- स्रोत सर्वर में निष्पादन:

INSERT INTO [DestinationLinkedServer].[DestinationDB].[dbo].[Table]
SELECT a, b, c, ... FROM [dbo].Udf_GetExportData()

इसे PUSHING डेटा कहा जाता है क्योंकि आप स्रोत सर्वर पर क्वेरी निष्पादित कर रहे हैं और डेटा को गंतव्य सर्वर में धकेल रहे हैं। यह महंगा ऑपरेशन होगा।

--- लक्ष्य सर्वर में निष्पादित

INSERT INTO [dbo].[Table]
SELECT a, b, c, ...
FROM OPENQUERY([OriginLinkedServer],
    'SELECT a, b, c, ... FROM [OriginDB].[dbo].Udf_GetExportData()')

इसे PULLING डेटा कहा जाता है क्योंकि आप गंतव्य सर्वर पर क्वेरी निष्पादित कर रहे हैं और स्रोत सर्वर से डेटा खींच रहे हैं। यह पहले वाले की तुलना में बहुत तेज और कम संसाधन वाला होगा (यह इस बात पर निर्भर करता है कि कितना डेटा खींचा जा रहा है)।

खींचने के तरीके के मामले में, SQL Profiler का उपयोग करके आप देखेंगे कि लिंक किए गए सर्वर (स्रोत सर्वर) पर एक एकल SQL स्टेटमेंट निष्पादित किया जाता है, और परिणामी को स्रोत सर्वर से गंतव्य सर्वर तक खींच लिया जाता है जो PUSH पर एक बहुत बड़ा प्रदर्शन लाभ है। तरीका।

एक और बात पर ध्यान दिया जाना चाहिए:

लिंक्ड सर्वर (4 भाग के नामकरण सम्मेलन में इस्तेमाल किया जाने वाला सर्वरनाम.डाटाबसेनमे.कहेम.टैबेलनाम उर्फ ​​डिस्ट्रिब्यूटेड क्वैरी) और ओपनरी के बीच, आम तौर पर ओपेनक्वेरी तेजी से होगा। क्यूं कर ?

लिंक्ड सर्वर के लिए - क्वेरी ऑप्टिमाइज़र क्वेरी नामकरण को देखकर एक निष्पादन योजना बनाता है और इसे दूरस्थ और स्थानीय प्रश्नों में तोड़ देता है। स्थानीय प्रश्नों को स्थानीय रूप से निष्पादित किया जाता है और दूरस्थ प्रश्नों के लिए डेटा को दूरस्थ सर्वर से एकत्र किया जाता है, स्थानीय रूप से स्क्रब किया जाता है, एक साथ जोड़ा जाता है और उपयोगकर्ता को एकल रिकॉर्ड सेट के रूप में प्रस्तुत किया जाता है।

OPENQUERY के लिए - निर्दिष्ट लिंक किए गए सर्वर पर पास-थ्रू क्वेरी निर्दिष्ट करता है। SQL सर्वर पास-थ्रू क्वेरीज़ को बिना व्याख्या किए गए क्वेरी स्ट्रिंग के रूप में OLE DB डेटा स्रोत पर भेजता है। इसलिए, SQL क्वेरी पर किसी भी प्रकार के तर्क को लागू नहीं करेगा और यह अनुमान लगाने की कोशिश नहीं करेगा कि क्वेरी क्या करेगी, यह केवल निर्दिष्ट क्वेरी को पारित करेगी क्योंकि यह लक्ष्य से जुड़े सर्वर पर है। जब आप एक क्वेरी में कई सर्वरों का संदर्भ नहीं दे रहे हैं, तब खुली क्वेरीज़ उपयोगी होती हैं। यह आम तौर पर तेज़ है क्योंकि SQL इसे कई ऑपरेशन में नहीं तोड़ता है और प्राप्त आउटपुट पर कोई स्थानीय कार्रवाई नहीं करता है।

उत्कृष्ट पढ़ने के संदर्भ:


8

आप दक्षता कैसे माप रहे हैं? कौन सा तेज होगा? कौन सा लक्ष्य पर कम संसाधनों का उपभोग करेगा? स्रोत पर? इन पंक्तियों में कॉलम कितने प्रकार और किस प्रकार के डेटा हैं? क्या आप वाकई एक लिंक्ड सर्वर के माध्यम से टीवीएफ निष्पादित कर सकते हैं (क्या लक्ष्य एसक्यूएल 2008 या बाद में है?) । यदि आप TVF से खींच रहे हैं तो आप इस डेटा का 1: 1 माइग्रेशन कैसे सुनिश्चित कर रहे हैं?

रास्ते से बाहर उन सवालों के साथ ...

अपडेट १

ऐसा लगता है कि आप ईटीएल (एक्सट्रैक्ट-ट्रांसफॉर्म-लोड) की तलाश कर रहे हैं। मैं SSIS (SQL Server इंटीग्रेशन सर्विसेज) की सिफारिश करूंगा, जिसके साथ आप स्रोत से डेटा खींच सकते हैं, उन परिवर्तनों को लागू कर सकते हैं जिनकी आपको आवश्यकता है, और फिर उन्हें अपने लक्ष्य में लोड करें। ऐसा लगता है कि यह एक बहुत सरल पैकेज (परिवर्तनों के आधार पर) होगा।


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

OPENQUERY विधि प्रसंस्करण को दूरस्थ सर्वर पर रखेगी और "फ़िल्टर किए गए परिणाम" स्थानीय सर्वर द्वारा प्राप्त किए जाएंगे।

ऐसा लगता है कि भले ही आप लिंक्ड सर्वर के माध्यम से टीवीएफ निष्पादित कर सकते हैं, आपको दुनिया में सबसे खराब, दूरस्थ रूप से प्रसंस्करण और स्थानीय रूप से प्रसंस्करण करना होगा (यह मानते हुए कि आपके पास सेट पर आवेदन करने के लिए अतिरिक्त तर्क है)।

आप आगे बढ़ने का निर्णय कैसे लेते हैं, इस पर निर्भर करते हुए, मैं OPENQUERYडेटा आयात / निर्यात डेटा के रूप में भी देखूंगा।

उस सब के बाद कहा ...

यदि SQL सर्वर पर स्रोत और लक्ष्य दोनों (और लक्ष्य निम्न संस्करण नहीं है), तो डेटा का बैकअप और पुनर्स्थापना क्यों नहीं करते हैं? यह एक सच्चा डेटा माइग्रेशन होगा। यहाँ आपके लिए कुछ कोड है

BACKUP DATABASE <DatabaseName, sysname, DatabaseName>
TO DISK=N'<backup_location, varchar, BackupLocation>.bak'
WITH INIT, FORMAT, COMPRESSION, COPY_ONLY

RESTORE DATABASE <NewDatabaseName, sysname, NewDatabaseName>
FROM DISK = N'<backup_location, varchar, BackupLocation>\
    <DatabaseName, sysname, DatabaseName>.bak'
WITH 
    MOVE '<DataFileName, sysname, DataFileName>' TO '<DataMDFPath, nvarchar(600), DataMDFPath>',
    MOVE '<LogFilePath, sysname, LogFilePath>' TO '<LogLDFPath, nvarchar(600), LogLDFPath>',
    REPLACE;

आप SSMS में टेम्प्लेट का उपयोग कैसे करें, इस उत्तर का उल्लेख कर सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.