2011-09-15 21 views
5

के साथ सबस्ट्रिंग बनाम एसक्यूएल तुलना का उपयोग करके एसक्यूएल तुलना का प्रदर्शन मैं 2 टेबलों के बीच एक जॉइन स्थिति पर काम कर रहा हूं जहां कॉलम में से एक मिलान मूल्यों का एक संयोजन है। मुझे टेबल ए से कॉलम बी के कॉलम बी के पहले 2 अक्षरों में कॉलम ए में शामिल होने की आवश्यकता है।वाइल्डकार्ड

मैंने इसे संभालने के लिए 2 अलग-अलग बयान विकसित किए हैं और मैंने प्रत्येक विधि के प्रदर्शन का विश्लेषण करने का प्रयास किया है।

विधि 1:

ON tB.columnB like tA.columnA || '%' 

विधि 2:

ON substr(tB.columnB,1,2) = tA.columnA 

क्वेरी कार्य योजना लागू करके एक बहुत कम चरणों विधि 1 का उपयोग कर विधि 2 की तुलना में है, तथापि, यह विधि 2 की तरह दिखता है बहुत कार्यान्वित और तेज। साथ ही, निष्पादन योजना विधि 2 के लिए एक अनुशंसित अनुक्रमणिका दिखाती है जो इसके प्रदर्शन को बेहतर बना सकती है।

मैं एक आईबीएम iSeries पर इस चला रहा हूँ, हालांकि एसक्यूएल क्वेरी अनुकूलन के बारे में अधिक जानने के लिए एक सामान्य अर्थ में जवाब में रुचि होगी।

क्या यह समझ में आता है कि विधि 2 तेजी से निष्पादित होगा?

यह SO सवाल समान है, लेकिन ऐसा लगता है कि इन दृष्टिकोणों के प्रदर्शन अंतर के लिए कोई ठोस जवाब प्रदान नहीं किया गया है: T-SQL speed comparison between LEFT() vs. LIKE operator

पुनश्च: तालिका डिजाइन कि शामिल होने के इस प्रकार की आवश्यकता है कुछ है कि मैं इस समय नहीं बदला प्राप्त कर सकते हैं नहीं है। मुझे लगता है कि अलग-अलग प्रकार के डेटा रखने वाले फ़ील्ड को अलग करना होगा।

+0

INNER या बाहरी जॉइन? –

+0

यह एक आंतरिक शामिल होने के लिए है। प्रकार में अंतर आएगा? – Swoop

+1

ठीक है, यह अनुमान लगाने के लिए शायद एक खोने वाला गेम है कि क्वेरी ऑप्टिमाइज़र में क्या हो रहा है। लेकिन हां, इस मामले में यदि यह एक इंटर्न जॉइन विधि 1 है तो सभी टीए को पढ़ने की आवश्यकता होती है जबकि विधि 2 को केवल टीबी पढ़ने की आवश्यकता होती है। पंक्तियों की संख्या के आधार पर, यह महत्वपूर्ण हो सकता है और निष्पादन योजना को प्रभावित कर सकता है। –

उत्तर

0

मुझे यह संदर्भ SQL प्रदर्शन से संबंधित आईबीएम रेडबुक में मिला। ऐसा लगता है कि SUBSTR स्केलर फ़ंक्शन को iSeries द्वारा अनुकूलित तरीके से प्रबंधित किया जा सकता है।

आप पहले वर्ण के लिए खोज और बजाय CQE की SQE का उपयोग करना चाहते हैं, तो आप बराबर के चिह्न के बाईं संकेत पर अदिश समारोह सबस्ट्रिंग उपयोग कर सकते हैं। यदि आपको स्ट्रिंग में अतिरिक्त वर्णों की खोज करनी है, तो आप अतिरिक्त रूप से स्केलर फ़ंक्शन POSSTR का उपयोग कर सकते हैं। द्वारा LIKE को कई स्केलर फ़ंक्शन में विभाजित करके, आप एसक्यूई का उपयोग करने के लिए क्वेरी ऑप्टिमाइज़र को प्रभावित कर सकते हैं।

http://publib-b.boulder.ibm.com/abstracts/sg246654.html?Open

2

हां, विधि 2 तेज होगा। पसंद एक समारोह के रूप में कुशल नहीं है।

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

+0

मैं अपने प्रश्नों को अनुकूलित करने में सहायता के लिए विजुअल स्पष्टीकरण का उपयोग कर रहा हूं, लेकिन मैं अभी भी यह जानने का प्रयास कर रहा हूं कि इस टूल का अधिकतम उपयोग कैसे करें। क्या आप इसके लिए किसी भी उन्नत दस्तावेज के बारे में जानते हैं? इस प्रकार मेरी Google खोजों ने केवल मूलभूत पसंदों को लोड किया है, जैसे विजुअल स्पष्टीकरण को लोड करना। – Swoop

+0

LIKE काफी कुशल हो सकता है यदि वाइल्डकार्ड तुलना स्ट्रिंग के अंत में है और इंजन तुलना के लिए उपलब्ध सूचकांक का उपयोग करने के लिए समझता है। –

+0

@ लैरी क्या आप कुछ परिस्थितियों में कह रहे हैं कि ऑप्टिमाइज़र अंत में वाइल्डकार्ड को LEFT() के बराबर समझा जाएगा? क्या आप कोई उदाहरण प्रदान कर सकते हैं जहां यह अधिक कुशल होगा? – WarrenT

2

मैं अपने डीबी 2 LUW 10 में तालिकाओं में से एक पर आईबीएम डेटा स्टूडियो में एसक्यूएल सलाहकार में निम्नलिखित भाग गया।1 डेटाबेस:

SELECT * 
FROM PDM.DB30 
WHERE DB30_SYSTEM_ID = 'XXX' 
    AND DB30_VERSION_ID = 'YYY' 
    AND SUBSTR(DB30_REL_TABLE_NM, 1, 4) = 'ZZZZ' 

और

SELECT * 
FROM PDM.DB30 
WHERE DB30_SYSTEM_ID = 'XXX' 
    AND DB30_VERSION_ID = 'YYY' 
    AND DB30_REL_TABLE_NM LIKE 'ZZZZ%' 

वे दोनों था ठीक उसी पहुँच ही सूचकांक, एक ही अनुमान आईओ लागत और एक ही अनुमान प्रमुखता, फर्क सिर्फ इतना है का उपयोग पथ का अनुमान किया जा रहा कुल सीपीयू LIKE के लिए लागत 178,343.75 थी जबकि SUBSTR 1 9 7,518.48 (~ 10% अंतर) था।

दोनों के लिए संचयी कुल लागत समान थी, इसलिए यह अंतर सलाहकार के अनुसार नगण्य है।

0

आप वास्तव में अपने डेटाबेस में वास्तविक उदाहरणों के साथ चल सकते हैं।

LIKE मेरे रन पर हमेशा बेहतर होता है।

select count(*) from u_log where log_text like 'AUT%'; 
1 row(s) returned : 90ms taken 

select count(*) from u_log where substr(log_text,1,3)='AUT'; 
1 row(s) returned : 493ms taken