2010-07-21 8 views
11

हम ओरेकल टेक्स्ट CTXSYS.CONTEXT इंडेक्स का उपयोग कर रहे हैं जिसमें मेटाफॉर्मेशन युक्त आधा मिलियन पंक्तियां हैं। जानकारी दो तालिकाओं में फैली हुई है जो एक प्रक्रिया द्वारा संयुक्त होते हैं जो सूचकांक रनटाइम (कार्यात्मक सूचकांक) पर कॉल करता है।ओरेकल टेक्स्ट इंडेक्सिंग को गति दें या इंडेक्सर को केवल कम लोड समय पर काम करें

जब मैं अपनी स्थानीय मशीन (सरल ड्यूलकोर नोटबुक) पर CREATE INDEX चलाता हूं तो सूचकांक लगभग 3 मिनट में बनाया जाता है। हमारे डीबी सर्वर पर जो 8 कोर और 16 जी रैम के साथ सोलारिस पर चलता है, वही (बिल्कुल वही) डेटा के लिए एक इंडेक्स बनाने में 24 घंटे लगते हैं।

नमूना कोड: यह दो टेबल और 3 कॉलम के लिए हमारे सूचकांक फीडर है:

create or replace procedure docmeta_revisions_text_feeder 
    (p_rowid in rowid , p_clob in out nocopy clob) as v_clob CLOB begin 
    FOR c1 IN (select DM.DID, DM.XDESCRIB || ' ' || DM.XAUTHOR AS data 
     from DOCMETA DM 
     WHERE ROWID = p_rowid) 
    LOOP 
     v_clob := v_clob || c1.data; 
     FOR c2 IN (
      SELECT ' ' || RV.DDOCTITLE AS data 
      FROM REVISIONS RV 
      WHERE RV.DID = c1.DID) 
     LOOP 
      v_clob := v_clob || c2.data; 
     END LOOP; 
    END LOOP; 
    p_clob := v_clob;  
    end docmeta_revisions_text_feeder 

ये प्राथमिकताएं

BEGIN 
CTX_DDL.CREATE_PREFERENCE ('concat_DM_RV_DS', 'USER_DATASTORE'); 
CTX_DDL.SET_ATTRIBUTE ('concat_DM_RV_DS', 'PROCEDURE', 
'docmeta_revisions_text_feeder'); 
END; 

अब हम सूचकांक बनाने हैं

CREATE INDEX concat_DM_RV_idx ON DOCMETA (FULLTEXTIDX_DUMMY) 
INDEXTYPE IS CTXSYS.CONTEXT 
PARAMETERS ('datastore concat_DM_RV_DS 
section group CTXSYS.AUTO_SECTION_GROUP 
') PARALLEL 4; 

डेटा में आमतौर पर एक साधारण शीर्षक या लेखक का नाम होता है + < 1k टेक्स्ट के साथ एक संक्षिप्त विवरण।

मैंने शामिल स्मृति सेटिंग्स और PARALLEL पैरामीटर के साथ थोड़ा सा खेलने की कोशिश की लेकिन कोई सफलता नहीं मिली। तो यहां मेरे प्रश्न आएं:

  • क्या इंडेक्सिंग प्रक्रिया को रोकने और फिर से शुरू करने का कोई तरीका है (मेरे पास सीटीएक्स_SYS भूमिका है)?
  • कोई भी संकेत है कि कौन सा पैरामीटर tweaked (esp। स्मृति आकार) tweaked किया जा सकता है?
  • क्या टेक्स्ट इंडेक्स को निर्यात और आयात करना संभव है? -> तो मैं अपनी स्थानीय मशीन पर इंडेक्सिंग कर सकता हूं और इसे बस हमारे सर्वर
  • पर कॉपी कर सकता हूं "इंडेक्सर" कम प्राथमिकता "के साथ चल सकता है?
  • यह संभव है कि सूचकांक लॉकिंग ऑपरेशंस द्वारा परेशान हो गया है (यह एक स्टेजिंग मशीन है जो समानांतर में अन्य पहुंच है)। क्या शामिल टेबल को लॉक करने, इंडेक्स बनाने और बाद में अनलॉक करने का कोई तरीका है?

उत्तर

9

हमने अंततः यह पता लगाया कि सूचकांक की एक अलग सिंक कैसे करें। यहां कुछ बुनियादी कदम दिए गए हैं जो दिखाते हैं कि हमने क्या किया:

CREATE INDEX concat_DM_RV_idx ON DOCMETA (FULLTEXTIDX_DUMMY) 
INDEXTYPE IS CTXSYS.CONTEXT 
PARAMETERS ('datastore concat_DM_RV_DS section group CTXSYS.AUTO_SECTION_GROUP 
NOPOPULATE 
'); 

NOPOPULATE पैरामीटर देखें? जो सूचकांक कहता है कि इसे पॉपुलटिंग/इंडेक्सिंग प्रक्रिया शुरू नहीं करनी चाहिए। यदि आप 11 जी पर हैं तो अब आपके पास एक बहुत अच्छी सीटीएक्स_DDL सुविधा है जो इंडेक्स पर इच्छानुसार पॉप्युलेट करता है, अर्थात् "POPULATE_PENDING" प्रक्रिया। इसे अपने इंडेक्स नाम पर कॉल करने से सीटीएक्सएसवाईएस तालिका पॉप्युलेट हो जाएगी जिसमें पंक्तियों को संशोधित किया गया है और इसलिए सिंक से बाहर हैं। ध्यान दें कि इस विधि को कॉल करने के बाद इंडेक्सर ने अभी भी कुछ भी शुरू नहीं किया है। चूंकि 10 जी (?) के अनुसार CTX_DDL.SYNC_INDEX प्रक्रिया के कई अतिरिक्त पैरामीटर हैं, उदा। "अधिकतम समय" पैरामीटर। इसे बताएं, कहें, 4 एच और आपका सूचकांक लंबित पंक्तियों को लगभग 4 घंटों तक सिंक करना शुरू कर देगा। आप शेड्यूल करके उस प्रक्रिया को दोहराते हैं और कर रहे हैं।

दुर्भाग्यवश 9i में काम नहीं करता है। इसलिए हमने ओरेकल POPULATE_PENDING प्रक्रिया को "अनुकरण" करने में सफलतापूर्वक प्रयास किया। इस विधि पर एकमात्र प्रतिबंध है: आपको किसी भी प्रकार की अनूठी पंक्ति पहचानकर्ता की आवश्यकता है ताकि आपकी तालिका से उसी सामग्री के भाग पूछ सकें।यहां हमने यह किया है:

1.) NOPOPULATE के साथ इंडेक्स बनाएं (ऊपर देखें) 2.) SYS/DBA/CTXSYS बनें (हाँ, आप इसके लिए अपने व्यवस्थापक को कॉल कर सकते हैं)।

SELECT IDX_ID FROM CTXSYS.CTX_INDEXES WHERE IDX_NAME ='concat_DM_RV_idx'; 

3.) ध्यान दें सूचकांक आईडी इस पत्र के एक पीले रंग की टुकड़ा पर उपज है और CTXSYS भूमिका के रूप में इस प्रविष्टि बयान निष्पादित और बदल देते हैं: आईडी कि सूचकांक मेटा तालिका पूछताछ की है अपने हाल में बनाई गई सूचकांक जानकारी प्राप्त करें <> आपकी अनुक्रमणिका आईडी और <> तालिका के नाम के साथ जिस पर इंडेक्स बनाया गया है। अद्वितीय पंक्ति पहचानकर्ता दस्तावेज़ आईडी किसी तरह का या गणनीय बयान के किसी भी प्रकार है कि आपके तालिका के डेटा का एक अनूठा हिस्सा बनाता है हो सकता है:

INSERT INTO CTXSYS.DR$PENDING (PND_CID,PND_PID,PND_ROWID,PND_TIMESTAMP) 
SELECT <<your index id>>, 0, <<basetable name>>.ROWID, CURRENT_DATE 
FROM gsms.DOCMETA 
WHERE <<basetable unique row identifier>> < 50000; 
COMMIT; -- Dont forget the COMMIT! DONT FORGET IT!!! WE MEAN IT! 

"50.000" की विरलता के आधार पर पंक्तियों की संख्या के निशान अपने बेसेटबेल जो लंबित पंक्ति तालिका में इंडेक्सर के लिए पेलोड के रूप में डाला जाएगा। अपनी जरूरतों के लिए इसे समायोजित करें।

4.) अब हम सूचकांक को ढीला करने के लिए सेटअप कर रहे हैं।

CALL CTX_DDL.SYNC_INDEX(
    'CONCAT_DM_RV_IDX', -- your index name here 
    '100M', -- memory count 
    NULL, -- param for partitioned idxes 
    2 -- parallel count 
); 

अनुक्रमण प्रक्रिया जो कुछ पंक्तियों की गिनती पर आप चरण 3. में डाला है) शुरू कर देंगे अगले 50.000 या तो पंक्तियों के साथ अगले हिस्सा दोहराने कदम 3.) ("जहां 50.000 और 100,000 के बीच आईडी को चलाने के लिए ")

अगर आप गलती से पंक्तियों का एक ही सेट पर इंडेक्सर चलाते हैं सूचकांक जोरदार खंड होगा। इसे साफ़ करने का एकमात्र तरीका एक REBUILD पैरामीटर के साथ इंडेक्स को अनुकूलित करना है। हमारे स्थानीय मशीन पर कि चूंकि इंडेक्सर को चलाने के लिए नहीं है बहुत तेज था, लेकिन केवल सूचकांक तालिकाओं की सामग्री rearranges:

CALL CTX_DDL.OPTIMIZE_INDEX('CONCAT_DM_RV_IDX', 'REBUILD'); 

आप अनुक्रमणिका बनाने की स्थिति और आकार के बारे में कुछ मेटा जानकारी की जरूरत है आप CTX_REPORT पूछ सकते हैं पैकेज:

SELECT CTX_REPORT.INDEX_SIZE('CONCAT_DM_RV_IDX') FROM DUAL; 

और आप भूल गए हैं जो पैरामीटर आप अनुक्रमण समय पर चुना:

SELECT * FROM CTXSYS.CTX_PARAMETERS; 

मुबारक अनुक्रमण!

+0

आपके शोध के लिए धन्यवाद। – egor7

+0

ग्रेट लिप्यंतर, मुझे पता लगाने के लिए सप्ताह लग गए। हालांकि, populate_pending स्रोत तालिका में सभी पंक्तियों/दस्तावेज़ों के साथ PENDING अनुक्रमणिका अद्यतनों की सूची पॉप्यूल करता है। ओरेकल को पता नहीं है कि क्या हो सकता है, आखिरकार, जो कुछ बदल गया है उसे ट्रैक करना ठीक है, सीटीएक्सएसवाईएस.डीआर $ पेंडिंग क्या है। इंडेक्स बनाने के दौरान या अगर आप सबकुछ फिर से इंडेक्स करना चाहते हैं तो इसका इस्तेमाल करें। – Roy

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