2010-08-26 14 views
6

मेरे SQL 2005 सर्वर पर, मेरे पास OraOLEDB.Oracle प्रदाता के माध्यम से ओरेकल से कनेक्ट एक लिंक किया गया सर्वर है।एसक्यूएल 2005 - ओरेकल क्वेरीज़ से लिंक किए गए सर्वर बेहद धीमे

अगर मैं ऐसा तरह 4 भाग पहचानकर्ता के माध्यम से क्वेरी चलाने: पूरा करने के लिए

SELECT * FROM [SERVER]...[TABLE] WHERE COLUMN = 12345 

यह एक मिनट से अधिक लेता है। यदि मैं वही क्वेरी चलाता हूं:

SELECT * FROM OPENQUERY(SERVER, 'SELECT * FROM TABLE WHERE COLUMN = 12345') 

यह तुरंत पूरा हो जाता है। क्या एक ऐसी सेटिंग है जो मुझे किसी सभ्य अवधि में चलाने के लिए पहली क्वेरी प्राप्त करने के लिए कहीं याद आ रही है? या मैं ओपनक्वायरी का उपयोग कर अटक गया हूँ?

उत्तर

10

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

वैकल्पिक रूप से जब आप OPENQUERY का उपयोग करते हैं, तो SQL सर्वर प्रसंस्करण के लिए लक्ष्य डेटाबेस पर SQL स्टेटमेंट भेजता है। प्रसंस्करण के दौरान टेबल पर किसी भी इंडेक्स लीवरेज होते हैं। परिणामस्वरूप SQL सर्वर पर परिणाम भेजने से पहले ओरेकल पक्ष पर जहां खंड लागू किया गया है।

मेरे अनुभव में, प्रश्नों के सबसे सरल को छोड़कर, OPENQUERY आपको बेहतर प्रदर्शन देने जा रहा है।

मैं उपर्युक्त कारणों से सबकुछ के लिए OpenQuery का उपयोग करने की अनुशंसा करता हूं।

ओपनक्वियर का उपयोग करते समय दर्द बिंदुओं में से एक जो आप पहले ही सामना कर चुके हैं वह एकल उद्धरण है। अगर रिमोट डीबी को एसक्यूएल स्ट्रिंग भेजा जा रहा है तो स्ट्रिंग या डेट डेट के आसपास सिंगल कोट्स की आवश्यकता होती है, जिसे उन्हें बचने की आवश्यकता होती है। अन्यथा वे अनजाने में एसक्यूएल स्ट्रिंग को समाप्त कर देते हैं।

DECLARE @UniqueId int 
, @sql varchar(500) 
, @linkedserver varchar(30) 
, @statement varchar(600) 

SET @UniqueId = 2 

SET @linkedserver = 'LINKSERV' 
SET @sql = 'SELECT DummyFunction(''''' + CAST(@UniqueId AS VARCHAR(10))+ ''''') FROM DUAL' 
SET @statement = 'SELECT * FROM OPENQUERY(' + @linkedserver + ', ' 
SET @Statement = @Statement + '''' + @SQL + ''')' 
EXEC(@Statement) 
:

यहाँ मैं का उपयोग करें कि जब भी मैं एकल उद्धरण समस्या की देखभाल करने के लिए एक लिंक किया सर्वर से एक OPENQUERY बयान में चर के साथ काम कर रहा हूँ एक टेम्पलेट है

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