11

स्थानीय सर्वर पर (एक एसक्यूएल सर्वर 2008 R2), मैं एक पर्याय जुड़ा हुआ सर्वर की ओर इशारा करते syn_view1 कहा जाता है remoteserver.remotedb.dbo.view1प्रदर्शन प्रभाव

इस धीमी क्वेरी 20 सेकंड चलाने के लिए ले जाता है ।

select e.column1, e.column2 
from syn_view1 e 
where e.column3 = 'xxx' 
    and e.column4 = 'yyy' 
order by e.column1 

यह तेजी से क्वेरी चलाने के लिए 1 सेकंड लेता है।

select e.column1, e.column2 
from remoteserver.remotedb.dbo.view1 e 
where e.column3 = 'xxx' 
    and e.column4 = 'yyy' 
order by e.column1 

दो प्रश्नों में एकमात्र अंतर वास्तव में समानार्थी की उपस्थिति है। जाहिर है, समानार्थी का क्वेरी के प्रदर्शन पर असर पड़ता है।

धीमा क्वेरी के लिये कार्य योजना है:

Plan    Cost % Subtree cost 
4 SELECT 
I/O cost: 0.000000 CPU cost: 0.000000 Executes: 0 
Cost: 0.000000     0.00 3.3521 
    3 Filter 
    I/O cost: 0.000000 CPU cost: 0.008800 Executes: 1 
    Cost: 0.008800    0.26 3.3521 
     2 Compute Scalar 
     I/O cost: 0.000000 CPU cost: 3.343333 Executes: 1 
     Cost: 0.000000   0.00 3.3433 
      1 Remote Query 
      I/O cost: 0.000000 CPU cost: 3.343333 Executes: 1 
      Cost: 3.343333  99.74 3.3433 

और तेजी से क्वेरी के लिए:

Plan   Cost % Subtree cost 
3 SELECT 
I/O cost: 0.000000 CPU cost: 0.000000 Executes: 0 
Cost: 0.000000    0.00 0.1974 
    2 Compute Scalar 
    I/O cost: 0.000000 CPU cost: 0.197447 Executes: 1 
    Cost: 0.000000   0.00 0.1974 
     1 Remote Query 
     I/O cost: 0.000000 CPU cost: 0.197447 Executes: 1 
     Cost: 0.197447  100.00 0.1974 

मेरे समझ है कि धीमी गति क्वेरी में, सर्वर से सभी डेटा को हासिल करेगा है रिमोट सर्वर, फिर फ़िल्टर लागू करता है (हालांकि सूचकांक के बिना) जबकि तेज क्वेरी में सर्वर रिमोट सर्वर से फ़िल्टर किए गए डेटा को प्राप्त करता है, इस प्रकार रिमोट इंडेक्स का उपयोग करता है।

क्या तेजी से होने पर समानार्थी का उपयोग करने का कोई तरीका है? शायद लिंक किए गए सर्वर का एक सेटअप? स्थानीय डेटाबेस सर्वर?

सहायता के लिए धन्यवाद!

+0

रिमोट सर्वर पर एक प्रक्रिया बनाने का सुझाव दें। –

+0

@AaronBertrand, यह क्या बदलेगा? क्या इंडेक्स का उपयोग किया जाएगा?क्या मैं अपनी संग्रहीत प्रक्रिया के अंदर जुड़े सर्वर के पूरे पूर्णतः योग्य नाम को निर्दिष्ट करने से बचने में सक्षम हूं? –

+0

हाँ और हाँ। और आप दृश्य के बजाय संग्रहीत प्रक्रिया नाम के लिए समानार्थी बना सकते हैं। –

उत्तर

1

dba.stacexchange.com पर this post के लिए स्वीकृत उत्तर नोट करता है कि लिंक किए गए सर्वर पर सीमित पहुंच अधिकारों के कारण लिंक किए गए सर्वरों पर प्रदर्शन में हो सकता है, स्थानीय सर्वर पर तालिका आंकड़ों की दृश्यता को प्रतिबंधित करता है। यह क्वेरी योजना को प्रभावित कर सकता है, और इस प्रकार प्रदर्शन।

अंश:

और यह कारण है कि मैं अलग परिणाम मिल गया है। Sysadmin I के रूप में चलते समय पूर्ण वितरण आंकड़े प्राप्त हुए जो संकेत देते हैं कि ऑर्डर आईडी> 20000 के साथ पंक्तियां नहीं हैं, और अनुमान एक पंक्ति थी। (याद रखें कि ऑप्टिमाइज़र आंकड़ों से शून्य पंक्तियों को कभी नहीं मानता है।) लेकिन जब सादे उपयोगकर्ता के रूप में चल रहा है, तो डीबीसीसी SHOW_STATISTICS अनुमति त्रुटि के साथ विफल रहा। यह त्रुटि प्रचारित नहीं की गई थी, लेकिन इसके बजाय ऑप्टिमाइज़र ने स्वीकार किया कि कोई आंकड़े नहीं थे और डिफ़ॉल्ट मान्यताओं का उपयोग किया गया था। चूंकि इसे कार्डिनालिटी की जानकारी मिली, इसलिए यह पता चला कि रिमोट टेबल में 830 पंक्तियां हैं, जहां से 24 9 पंक्तियों का अनुमान है।

+0

मैं देख सकता हूं कि किसी लिंक किए गए सर्वर पर किसी क्वेरी का प्रदर्शन कितने मुद्दों से भिन्न हो सकता है, लेकिन समानार्थी क्वेरी और लिंक की गई तालिका के बीच का अंतर क्यों है; आखिरकार समानार्थी एक ही कनेक्शन देता है, जब तक कि आप सुझाव नहीं दे रहे हैं कि समानार्थी पर एक अलग पहुंच सही सेट हो सकता है? – PhillipH

+1

@PhillipH: स्पष्ट रूप से * समानार्थी के लिए कुछ * अलग है; यह स्पष्टीकरण प्रदर्शन प्रदर्शन गिरावट का कारण बनने के लिए पर्याप्त लगता है, इसलिए रिमोट सर्वर पर जांच करने लायक है। –

2

मैं स्थानीय सर्वर पर एक अस्थायी तालिका में द्वारा डेटा के आदेश के बिना डंप होगा। फिर मैं आदेश के साथ temp तालिका से चयन करेंगे। आदेश हमेशा हत्यारा है।

संबंधित मुद्दे