एक दृश्य में OPENQUERY का उपयोग करने के प्रदर्शन निहितार्थ


15

इस प्रश्न को स्टैकओवरफ़्लो पर देखें :

मैं एक EasySoft ODBC ड्राइवर का उपयोग इंटरबेस के लिए SQL Server 2008 R2 एक्सप्रेस उदाहरण को लिंक करने के लिए कर रहा हूं और मुझे दूरस्थ सर्वर से मेटाडेटा प्राप्त करने में कुछ कठिनाई हो रही है। नेट के बारे में देखने से लेकर मुख्य सबस्टेशनों में चार भाग से जुड़े सर्वर सिंटैक्स के बजाय OPENQUERY का उपयोग करने का उल्लेख है।

ईजी मेरा वर्तमान (समस्याग्रस्त) दृष्टिकोण है ...

CREATE VIEW [LIVE].[vwPRDETS]
AS

SELECT *
FROM [LBLIVE]...[PRDETS] WITH (NOLOCK)

लेकिन कुछ तालिकाओं पर मुझे दृश्य को कॉल करते समय त्रुटि मिलती है ...

Msg 7353, स्तर 16, राज्य 1, लाइन 1 OLE DB प्रदाता "MSDASQL" जुड़े सर्वर "LBLIVE" के लिए असंगत मेटाडेटा की आपूर्ति की। निष्पादन के दौरान एक अतिरिक्त स्तंभ की आपूर्ति की गई थी जो संकलन समय पर नहीं मिली थी।

इसके अलावा, कुछ विचार मैं भी नहीं बना सकता क्योंकि मुझे निम्नलिखित मिलते हैं ...

Msg 7315, लेवल 16, स्टेट 1, लाइन 1 लिंक सर्वर "LBLIVE" के लिए OLE DB प्रदाता "MSDASQL" में "SYSDBA" "AUDIT_LBABKP" नाम से मेल खाने वाले कई टेबल हैं।

यद्यपि उल्लिखित तालिकाओं में से केवल एक ही है।

नेट की खोज से वैकल्पिक दृष्टिकोण की तरह लगता है ...

SELECT *
FROM OPENQUERY(<linked sevrer>, 'SELECT <column list> FROM MyTable')

तो, मेरा प्रश्न यह है कि अगर मैं अपने दृष्टिकोण में OPENQUERY का उपयोग करता हूं, तो क्या SQL सर्वर Interbase को भेजे जाने वाले SQL को अनुकूलित करने में सक्षम होगा? या वास्तव में दोनों दृष्टिकोणों के बीच बहुत अंतर नहीं है?

यह विषय पर एक क्रॉस है और एक डीबीए के पीओवी को पसंद करेगा।

जवाबों:


20

सारांश

लिंक किए गए सर्वर को अधिक से अधिक करने दें।
यह है असंभव एसक्यूएल सर्वर, यहां तक कि एक और एसक्यूएल सर्वर किसी लिंक किए गए सर्वर पर एक प्रश्न का अनुकूलन करने के लिए

लंबा

कुंजी कारक वह जगह है जहाँ क्वेरी चलती है।

इस मामले में, यह एक तुच्छ चयन है, इसलिए एक मेज से सभी पंक्तियों को तार के नीचे भेजा जाएगा। इससे कोई फर्क नहीं पड़ता।

जब आप JOINs और WHEREs जोड़ते हैं तो यह मायने रखता है। आप चाहते हैं कि SQL सर्वर लिंक्ड सर्वर को नेटवर्क पर आने वाले डेटा के आकार को कम करने के लिए जितना संभव हो उतना फ़िल्टरिंग करने की अनुमति दे।

उदाहरण के लिए, यहां दूसरा मामला अधिक कुशल होना चाहिए।

SELECT *
FROM OPENQUERY(<linked server>, 
            'SELECT <column list> FROM MyTable') T1
     JOIN
     SomeLocalTable T2 ON ...
WHERE T1.foo = 'bar'

SELECT *
FROM OPENQUERY(<linked server>, 
           'SELECT <column list> FROM MyTable WHERE foo = ''bar''')
     JOIN
     SomeLocalTable T2 ON ...

OPENQUERY की एक सीमा यह है कि आप पैराड्राइज़ नहीं कर सकते: इसलिए आपको WHERE क्लॉज़ आदि जोड़ने के लिए डायनेमिक SQL की आवश्यकता है।

लिंक्ड सर्वर का प्रदर्शन इससे प्रभावित हो सकता है sp_serveroption। सेटिंग collation compatibleयह सब कहती है

यदि यह विकल्प सही पर सेट होता है, तो SQL सर्वर मानता है कि लिंक किए गए सर्वर में सभी वर्ण स्थानीय सर्वर के साथ संगत हैं, जिसमें कैरेक्टर सेट और कॉलेक्शन सीक्वेंस (या क्रम क्रम) शामिल हैं। यह SQL सर्वर प्रदाता को वर्ण स्तंभों पर तुलना भेजने में सक्षम बनाता है। यदि यह विकल्प सेट नहीं है, तो SQL सर्वर हमेशा स्थानीय स्तर पर वर्ण स्तंभों की तुलना का मूल्यांकन करता है।

यानी, SQL सर्वर को डेटा को स्थानीय रूप से संसाधित नहीं करने दें।

नोट: foo = 'bar'ऊपर मेरे 2 उदाहरण पर, फ़िल्टर को लिंक किए गए सर्वर पर भेजा गया है क्योंकि यह SQL सर्वर के लिए एक स्ट्रिंग है। पहले उदाहरण में असली WHERE क्लॉज दूरस्थ रूप से भेजा जा सकता है या नहीं।

अंत में, मैंने यह भी पाया है कि डेटा को एक अस्थायी तालिका में शामिल करना और स्थानीय तालिकाओं में शामिल करना अक्सर बेहतर होता है, फिर सीधे OPENQUERY पर जुड़ना।


+1 दूरस्थ सर्वर पर स्ट्रिंग स्ट्रिंग शाब्दिक के खिलाफ तुलना करने पर मेरा साधारण क्यों नहीं था? इसका उत्तर था "टकराव संगत"। धन्यवाद।
मावरम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.