2009-05-19 14 views
13

मैं दोनों Firebird एम्बेडेड और Firebird सर्वर, और समय-समय पर उपयोग करें मैं निम्नलिखित की तरह एक प्रक्रिया का उपयोग कर टेबल पुन: अनुक्रमणिका की जरूरत है:क्या फायरबर्ड को मैन्युअल रीइंडेक्सिंग की आवश्यकता है?

CREATE PROCEDURE MAINTENANCE_SELECTIVITY 
ASDECLARE VARIABLE S VARCHAR(200); 
BEGIN 
FOR select RDB$INDEX_NAME FROM RDB$INDICES INTO :S DO 
BEGIN 
S = 'SET statistics INDEX ' || s || ';'; 
EXECUTE STATEMENT :s; 
END 
SUSPEND; 
END 

मुझे लगता है कि यह सामान्य एम्बेडेड उपयोग कर रहा है, लेकिन यह वास्तव में का उपयोग कर की जरूरत है एक सर्वर? क्या आवश्यक या आवधिक रूप से सर्वर को स्वचालित रूप से करने के लिए सर्वर को कॉन्फ़िगर करने का कोई तरीका है?

+2

बस एक नोट। इस प्रक्रिया में SUSPEND अनावश्यक है। –

+0

धन्यवाद! मुझे लगता है कि मैंने इसे कहीं से कॉपी किया है। – pablo

+2

असल में, आप रीइंडेक्सिंग नहीं कर रहे हैं लेकिन केवल इंडेक्स आंकड़ों को फिर से समझते हैं। बड़ी टेबल पर रीइंडेक्सिंग बहुत धीमी हो सकती है। आंकड़ों की गणना करना हमेशा तेज़ होता है। –

उत्तर

20

सबसे पहले, मुझे बताएं कि मैं कोई फायरबर्ड विशेषज्ञ नहीं हूं, इसलिए मैं SQL सर्वर के काम के आधार पर जवाब दे रहा हूं।

उस स्थिति में, उत्तर हाँ, और नहीं दोनों है।

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

समस्या, हालांकि, सूचकांक के साथ नहीं है, लेकिन आंकड़ों के साथ। आप कह रहे हैं कि आपको तालिकाओं को फिर से संशोधित करने की आवश्यकता है, लेकिन फिर आप कोड दिखाते हैं जो आंकड़ों का उपयोग करता है, और यही कारण है कि मैं जवाब दे रहा हूं।

संक्षिप्त उत्तर यह है कि समय के साथ-साथ आंकड़े धीमे हो जाते हैं। वे उस बिंदु पर बिगड़ नहीं सकते हैं जहां वे अनुपयोगी हैं, लेकिन जब आप उन्हें फिर से बनाते/पुन: गणना करते हैं तो वे उस पूर्ण स्तर से बिगड़ जाएंगे जब वे होते हैं। वह "हां" हिस्सा है।

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

उदाहरण के लिए, मान लें कि आपके इंडेक्स में से एक के आंकड़े आंकड़े हैं जो कहता है कि चाबियाँ वैल्यू स्पेस के एक छोर पर एक साथ चिपक जाती हैं (उदाहरण के लिए, 0 और 1 के बहुत से इंट-कॉलम)। फिर आप मूल्यों के साथ बहुत सारी पंक्तियां डालते हैं जो इस सूचकांक को पूरे स्पेक्ट्रम में फैलाने वाले मानों को शामिल करते हैं।

यदि अब आप एक क्वेरी करते हैं जो किसी अन्य तालिका से जुड़ने का उपयोग करता है, तो निम्न इंडेक्स के साथ तालिका के विरुद्ध कम चयनकता (0 और 0 के बहुत सारे) वाले कॉलम पर, क्वेरी ऑप्टिमाइज़र यह समझ सकता है कि यह अनुक्रमणिका अच्छा, क्योंकि यह कई पंक्तियों को लाएगा जो एक ही समय में उपयोग किए जाएंगे (वे एक ही डेटा पेज पर हैं)।

हालांकि, डेटा बदल गया है, इसलिए यह प्रासंगिक टुकड़ों को खोजने के लिए सभी इंडेक्स पर कूद जाएगा, और इस प्रकार सभी के बाद इतना अच्छा नहीं होगा।

आंकड़ों को पुन: गणना करने के बाद, क्वेरी ऑप्टिमाइज़र देख सकता है कि यह अनुक्रमणिका इस क्वेरी के लिए उप-इष्टतम है, और इसके बजाय एक और अनुक्रमणिका चुनें, जो अधिक उपयुक्त है।

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

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

+3

+1 सही स्पष्टीकरण – idursun

+0

बिल्कुल, मैं जो कहना चाहता था वह है कि वास्तव में आंकड़ों को फिर से गणना करना महत्वपूर्ण हो सकता है जब बड़ी संख्या में डेटा पेश किया जाता है, और मेरी चिंता यह है कि फायरबर्ड स्वचालित रूप से उन्हें पुन: गणना नहीं करता है, और कोई (स्पष्ट नहीं) SQL सर्वर में नौकरी के साथ ऐसा करने का तरीका। – pablo

+1

फिर मुझे लगता है कि एक बैच फ़ाइल जो सही कमांड लाइन टूल्स को कॉल करती है और एसक्यूएल कथन या स्पॉक्स को निष्पादित करती है, आपको केवल एक ही पसंद है, जब तक आप साहसी महसूस न करें, और स्वयं टूल बना सकें :) –

7

यह रीइंडेक्स नहीं करता है, यह इंडेक्स के लिए वजन को पुन: संकलित करता है, जिसका उपयोग ऑप्टिमाइज़र द्वारा सबसे इष्टतम सूचकांक का चयन करने के लिए किया जाता है। आपको तब तक ऐसा करने की आवश्यकता नहीं है जब तक कि सूचकांक का आकार बहुत न हो। यदि आप डेटा जोड़ने से पहले इंडेक्स बनाते हैं, तो आपको पुनर्मूल्यांकन करने की आवश्यकता है।

एम्बेडेड और सर्वर प्रक्रिया मॉडल के अलावा बिल्कुल समान कार्यक्षमता होनी चाहिए।

+0

आप सही हैं। लेकिन वैसे भी, इसका प्रदर्शन पर बहुत बड़ा असर पड़ता है। तो, आप का मतलब है कि उनमें से कोई भी स्वचालित रूप से ऐसा नहीं करेगा? – pablo

+0

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

2

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

SET TERM^; 
CREATE OR ALTER PROCEDURE NEW_PROCEDURE 
AS 
DECLARE VARIABLE S VARCHAR(300); 
begin 
    FOR select 'SET statistics INDEX ' || RDB$INDEX_NAME || ';' 
    FROM RDB$INDICES 
    WHERE RDB$INDEX_NAME <> 'PRIMARY' INTO :S 
    DO BEGIN 
    EXECUTE STATEMENT :s; 
    END 
end^ 
SET TERM ;^

GRANT EXECUTE ON PROCEDURE NEW_PROCEDURE TO SYSDBA; 
संबंधित मुद्दे