2010-11-24 13 views
8

काम में हम चाहते हैं कि निम्नलिखित संरचना था एक मेज पर एक प्रश्न था क्यों है।इस रेंज आधारित क्वेरी इतना तेज

दिए गये IP पते हम की तरह एक प्रश्न का इस्तेमाल किया के लिए विवरण के लिए निम्नलिखित:

SELECT * 
    FROM Ip2location 
WHERE 
    :ip_num BETWEEN ip_from AND ip_to; 

हमारे देव डेटाबेस में ओरेकल 10 पर यह लगभग ले लिया 17 सेकंड एक पंक्ति वापस जाने के लिए, ip_num पर निर्भर करता है हमारे बीफियर लाइव सिस्टम पर इसे 5-6 सेकेंड लग गए, जो वास्तविक समय में अभी भी धीमा था और हमें पृष्ठभूमि नौकरी के माध्यम से इसे चुनने की आवश्यकता थी।

आदर्श नहीं, खासकर जब हमारे वास्तविक समय सिस्टम को वास्तव में आईपी विवरण की आवश्यकता होती है।

प्रयुक्त इंडेक्स का प्रकार ip_from और ip_to दोनों में फैले मानक बीटीई इंडेक्स था। हमने range partitioning जैसे इसे गति देने की कोशिश करने के लिए बहुत सी चीजों को देखा। हमने अंत में इसे लागू नहीं किया क्योंकि इसे ओरेकल एंटरप्राइज़ की आवश्यकता है। हमने टेबल की समेकन बढ़ाने पर भी ध्यान दिया लेकिन इसका कोई उल्लेखनीय प्रभाव नहीं पड़ा।

वैसे भी जब मेरी सुबह कॉफी होने पर मुझे एहसास हुआ कि मैंने सोचा था कि निम्नलिखित क्वेरी को चलाकर प्रदर्शन वृद्धि हो सकती है: (यह स्मृति से है, कुछ गलतियां हो सकती हैं। साथ ही हमने अलग-अलग फ़ील्ड भी नहीं चुना)

SELECT * 
    FROM ip2location 
WHERE 
    ip_from = (
    SELECT max(ip_from) 
     FROM ip2location 
     WHERE ip_from <= :ip_num 
) 
AND 
    ip_to >= ip_num; 

यह हमारे डेटा सेट के लिए है, क्योंकि ip_from और ip_to के बीच कोई अतिव्यापी पर्वतमाला काम करता है।

हालांकि जो भी मैं तैयार नहीं था, वह दूसरी क्वेरी कितनी तेज़ी से है। हमारे देव डेटाबेस पर समय 17 सेकंड से 0.007 सेकेंड तक घटा दिया गया था।

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

मेरा प्रश्न है: उप-चयन का उपयोग करके दूसरी क्वेरी इतनी तेज क्यों है?

+0

आप एक संयुक्त एक के बजाय अलग अनुक्रमित करने की कोशिश की गणना करने के लिए पर स्कैन करने के लिए है? –

+0

क्या समझाया गया आदेश आपको बताएगा क्यों? –

+0

@ थॉमस पैड्रॉन-मैककार्थी हमने क्वेरी के पुराने संस्करण के लिए किया था। एक संयुक्त सूचकांक तेजी से था। हम नई क्वेरी के खिलाफ एकल सूचकांक के साथ परीक्षण करना चाहते हैं। @nate सी - मुझे व्याख्या योजना में बहुत उपयोगी नहीं मिला। मैं एक डेवलपर हूं जो डीबीए नहीं है। क्या यह उपयोगी होगा अगर काम पर मैंने प्रश्नों की व्याख्या दोनों योजनाओं में रखा हो? – Wes

उत्तर

7

प्रदर्शन वृद्धि स्पष्ट है। इसकी वजह यह है कि ip_from पर एक अनुक्रमणिका है, इसलिए अधिकतम (ip_from) निरंतर समय में प्राप्त किया जा सकता है क्योंकि आप जानते हैं कि इंडेक्सिंग मानों को टाइप करता है। सीमा पर बाइनरी खोज के कारण रेंज भी आसानी से गणना की जाती है।

देर में पहले की क्वेरी तालिका सभी डेटा सीमा सीमा

+0

क्या यह सच है यद्यपि संयुक्त सूचकांक था? – Wes

+0

वेस: डीबी इंजन नहीं जानता कि 'ip_to' 'ip_from' से कम नहीं है। – Gabe

+0

@Gabe क्या सांख्यिकीय इंजन इसे नहीं ढूंढ पाएगा?मुझे लगता है कि मैं इस क्वेरी से संबंधित कुछ अलग-अलग प्रश्न पूछूंगा। – Wes

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