आप किसी क्वेरी की व्याख्या योजना की व्याख्या कैसे करते हैं?


88

जब यह समझने का प्रयास किया जाता है कि SQL स्टेटमेंट कैसे निष्पादित हो रहा है, तो कभी-कभी स्पष्टीकरण योजना को देखने की सिफारिश की जाती है। एक व्याख्या योजना की व्याख्या (समझ बनाने) में क्या प्रक्रिया होनी चाहिए? "ओह, यह शानदार ढंग से काम कर रहा है?" बनाम "ओह नहीं, यह सही नहीं है।"

जवाबों:


80

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

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

तो, एक व्याख्या योजना को पढ़ने के तरीके के तंत्र के लिए ओरेकल प्रलेखन एक अच्छा मार्गदर्शक है: http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/ex_plan.htm/PFGRF009

प्रदर्शन ट्यूनिंग गाइड के माध्यम से भी एक अच्छा पढ़ा है।

"कार्डिनैलिटी फीडबैक" के लिए एक Google भी है, जिसमें एक तकनीक है जिसमें निष्पादन के दौरान अनुभव की गई वास्तविक कार्डिनैलिटी के साथ क्वेरी में विभिन्न चरणों में कार्डिनैलिटी के अनुमानों की तुलना करने के लिए एक व्याख्या योजना का उपयोग किया जा सकता है। वोल्फगैंग Breitling विधि के लेखक हैं, मुझे विश्वास है।

तो, निचला रेखा: पहुंच तंत्र को समझें। डेटाबेस को समझें। क्वेरी के इरादे को समझें। अंगूठे के नियमों से बचें।


5
मुझे पता था कि यह पहले 9 शब्दों के बाद आप थे। यह "नेम दैट ट्यून" की तरह है ... मैं n शब्दों या उससे कम शब्दों में एक डेव ए पोस्ट की पहचान कर सकता हूं ...

मैं "बड़े" के आपके उपयोग के साथ थोड़ा सा बुदबुदाऊंगा ... कभी-कभी डेटा आपके सूचकांक स्तंभों के चारों ओर इतना खराब हो सकता है कि एक एफटीएस भी 10% पंक्तियों के लिए एक सूचकांक स्कैन करेगा ...

1
10% पर - बिल्कुल। यदि आपके पास प्रति ब्लॉक 200 पंक्तियां हैं और आप 0.5% पंक्तियों की तलाश कर रहे हैं, तो आपको सैद्धांतिक रूप से सभी मान प्राप्त करने के लिए 100% ब्लॉकों तक पहुंच प्राप्त करनी पड़ सकती है, इसलिए यह 10% से भी अधिक चरम पर पहुंच जाता है।
डेविड एल्ड्रिज

13

यह विषय इस तरह के प्रश्न का उत्तर देने के लिए बहुत बड़ा है। ओरेकल के प्रदर्शन ट्यूनिंग गाइड को पढ़ने के लिए आपको कुछ समय लेना चाहिए



5

नीचे दिए गए दो उदाहरण एक पूर्ण स्कैन और एक INDEX का उपयोग करके एक फास्ट स्कैन दिखाते हैं।

अपनी लागत और कार्डिनैलिटी पर ध्यान केंद्रित करना सबसे अच्छा है। उदाहरणों को देखते हुए सूचकांक का उपयोग क्वेरी को चलाने की लागत को कम करता है।

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

यह मत भूलो कि एक क्वेरी की लागत आपकी क्वेरी और ओरेकल ऑप्टिमाइज़र मॉडल (जैसे: COST, CHOOSE आदि) से प्रभावित हो सकती है और आप कितनी बार अपने आँकड़े चलाते हैं।

उदाहरण 1:

SCAN http://docs.google.com/a/shanghainetwork.org/File?id=dd8xj6nh_7fj3cr8dx_b

उदाहरण 2 अनुक्रमणिका का उपयोग कर:

INDEX http://docs.google.com/a/fukuoka-now.com/File?id=dd8xj6nh_9fhsqvxcp_b

और जैसा कि पहले ही सुझाव दिया गया है, टेबल स्कैन के लिए देखें। आप आमतौर पर इनसे बच सकते हैं।


उह, नियम मोड में लागत नहीं है ... इसलिए मुझे लगता है कि आपका कथन एक तरह से निरपेक्ष तरीके से सही है, लेकिन मैं कहूंगा कि यह मौलिक रूप से गलत है। यदि आप कहते हैं, तो आप आरबीओ या सीबीओ प्राप्त कर सकते हैं। सीबीओ केवल एक है जो एक लागत को शांत करता है।

4

अनुक्रमिक स्कैन जैसी चीजों की तलाश कुछ हद तक उपयोगी हो सकती है, लेकिन वास्तविकता संख्याओं में है ... सिवाय जब संख्याएं सिर्फ अनुमान हैं! क्या आम तौर पर है अब तक और अधिक उपयोगी एक प्रश्न को देखकर से योजना वास्तविक में दिख रही है निष्पादन । Postgres में, यह EXPLAIN और EXPLAIN ANALYZE के बीच अंतर है। सटीक विश्लेषण वास्तव में क्वेरी को निष्पादित करता है, और हर नोड के लिए वास्तविक समय की जानकारी प्राप्त करता है। इससे आपको पता चलता है कि वास्तव में क्या हो रहा है, इसके बजाय योजनाकार क्या सोचता है हैं। कई बार आप पाएंगे कि अनुक्रमिक स्कैन बिल्कुल भी समस्या नहीं है, इसके बजाय यह क्वेरी में कुछ और है।

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


3

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

एक बात का ध्यान रखें, यह है कि व्याख्या की योजना वास्तव में सबसे अच्छा अनुमान है।

Sqlplus का उपयोग करना और AUTOTRACE कमांड के साथ प्रयोग करना सीखना अच्छा होगा। कुछ कठिन संख्याओं के साथ, आप आमतौर पर बेहतर निर्णय ले सकते हैं।

लेकिन आपको ASKTOM चाहिए। वह इसके बारे में सब जानता है :)


2

व्याख्या का आउटपुट आपको बताता है कि प्रत्येक चरण में कितना समय लगा है। पहली बात यह है कि उन चरणों को ढूंढना है जो लंबे समय से हैं और समझते हैं कि उनका क्या मतलब है। अनुक्रमिक स्कैन जैसी चीजें आपको बताती हैं कि आपको बेहतर अनुक्रमित की आवश्यकता है - यह ज्यादातर आपके विशेष डेटाबेस और अनुभव में शोध का विषय है।


2

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

Seq Scan on my_table  (cost=0.00..15558.92 rows=620092 width=78)

कभी-कभी तालिका स्कैन आदर्श होते हैं, कहते हैं, पंक्तियों को क्वेरी करने के लिए एक सूचकांक का उपयोग करते हुए। हालाँकि, यह उन रेड-फ्लैग पैटर्न में से एक है जिसकी आपको तलाश है।


2
(पूर्ण) टेबल स्कैन आवश्यक रूप से मेमोरी कैश को शुद्ध नहीं करते हैं।
a_horse_with_no_name

2

मूल रूप से, आप प्रत्येक ऑपरेशन पर एक नज़र डालते हैं और देखते हैं कि संचालन "समझ में" आता है या नहीं, यह जानने के लिए कि यह कैसे काम करने में सक्षम होना चाहिए।

उदाहरण के लिए, यदि आप अपने संबंधित कॉलम C और D (AC = BD) पर दो तालिकाओं, A और B से जुड़ रहे हैं, और आपकी योजना तालिका पर एक क्लस्टर इंडेक्स स्कैन (SQL सर्वर शब्द - निश्चित नहीं है तो निश्चित है) ए, फिर एक नेस्टेड लूप टेबल बी पर क्लस्टर किए गए इंडेक्स सीक की श्रृंखला में शामिल होता है, आपको लगता है कि कोई समस्या थी। उस परिदृश्य में, आप इंजन को मर्ज किए जाने के बाद अनुक्रमणिका स्कैन (सम्मिलित स्तंभों पर अनुक्रमणिका पर) की एक जोड़ी करने की उम्मीद कर सकते हैं। आगे की जांच से खराब आंकड़ों का पता चल सकता है, जिससे ऑप्टिमाइज़र को लगता है कि पैटर्न में शामिल हों, या एक सूचकांक जो वास्तव में मौजूद नहीं है।


1

योजना के प्रत्येक उपधारा में बिताए समय के प्रतिशत को देखें, और विचार करें कि इंजन क्या कर रहा है। उदाहरण के लिए, यदि यह एक तालिका को स्कैन कर रहा है, तो उस क्षेत्र (ओं) पर एक सूचकांक डालने पर विचार करें जो स्कैन कर रहा है


1

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

से http://www.sql-server-performance.com/tips/query_execution_plan_analysis_p1.aspx :

यदि आपको निष्पादन योजना में निम्नलिखित में से कोई भी दिखाई देता है, तो आपको उन्हें चेतावनी के संकेतों पर विचार करना चाहिए और संभावित प्रदर्शन समस्याओं के लिए उनकी जांच करनी चाहिए। उनमें से प्रत्येक प्रदर्शन के दृष्टिकोण से आदर्श से कम हैं।

* Index or table scans: May indicate a need for better or  additional indexes.
* Bookmark Lookups: Consider changing the current clustered index,
  consider using a covering index, limit
  the number of columns in the SELECT
  statement.
* Filter: Remove any functions in the WHERE clause, don't include wiews
  in your Transact-SQL code, may need
  additional indexes.
* Sort: Does the data really need to be sorted? Can an index be used to
  avoid sorting? Can sorting be done at
  the client more efficiently? 

इनसे बचना हमेशा संभव नहीं होता है, लेकिन जितना अधिक आप इनसे बच सकते हैं, उतनी ही तेज क्वेरी प्रदर्शन होगा।


1
टेबल स्कैन सभी खराब नहीं होते हैं - तालिका से लौटे / संसाधित किए गए रिकॉर्ड की संख्या के आधार पर, एक पूर्ण टेबल स्कैन एक इंडेक्स स्कैन से तेज हो सकता है (यदि आप किसी भी तरह से रिकॉर्ड वापस लाने जा रहे हैं, तो आप एक इंडेक्स स्कैन करेंगे। और मेज से एक पूरा पढ़ा - 1 के बजाय 2 कदम)।
स्कॉटकर

-7

अंगूठे का नियम

(आप शायद विवरण पर भी पढ़ना चाहते हैं:

खराब

कई बड़े तालिकाओं की तालिका स्कैन

अच्छा

एक अद्वितीय सूचकांक का उपयोग करना
इंडेक्स में सभी आवश्यक फ़ील्ड शामिल हैं

सबसे आम जीत

लगभग 90% प्रदर्शन समस्याओं में मैंने देखा है, सबसे आसान जीत 2 छोटे प्रश्नों और एक अस्थायी तालिका में बहुत सारी (4 या अधिक) तालिकाओं के साथ एक क्वेरी को तोड़ना है।


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

8
अपमानजनक सलाह के लिए नीचा दिखाया। प्रदर्शन की समस्याओं का 90% अस्थायी तालिकाओं और एक क्वेरी को विभाजित करके हल नहीं किया जाता है। आप किस दुनिया में रहते हैं?!
द सेसंपेरजेडी

@ जेडी, मैं एक ऐसी दुनिया में रहता हूं, जहां पर इंन्डोले ज्यादातर सही होते हैं और डेटाबेस बहुत ज्यादा समझदारी से संरचित होते हैं। मुझे आपका उत्तर पढ़ने में दिलचस्पी होगी, हालाँकि।
ए जे।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.