2010-07-21 29 views
11

Chúng tôi đang sử dụng chỉ mục CTXSYS.CONTEXT của Oracle Text để lập chỉ mục khoảng nửa triệu hàng chứa thông tin xác thực. Thông tin được trải rộng trên hai bảng được kết hợp bởi một thủ tục mà trình chỉ mục gọi khi chạy (chỉ mục chức năng).Tăng tốc độ lập chỉ mục văn bản Oracle hoặc để chỉ mục hoạt động chỉ khi thời gian tải thấp

Khi tôi chạy CREATE INDEX trên máy cục bộ của mình (sổ ghi chép hai lõi đơn giản), chỉ mục được tạo trong khoảng 3 phút. Trên máy chủ DB chạy trên Solaris với 8 lõi và 16G RAM, phải mất 24 giờ để tạo chỉ mục cho cùng một dữ liệu (chính xác). đang

mẫu: Đây là nạp chỉ mục của mình cho hai bảng và 3 cột:

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 

Đây là những ưu đãi về

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; 

Bây giờ chúng ta tạo ra chỉ số

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; 

Dữ liệu chủ yếu bao gồm tiêu đề đơn giản hoặc tên tác giả + mô tả ngắn với văn bản1k.

Tôi đã cố gắng phát một chút với các cài đặt bộ nhớ liên quan và tham số PARALLEL nhưng không thành công. Vì vậy, đây là câu hỏi của tôi:

  • có cách nào để tạm dừng và tiếp tục quy trình lập chỉ mục (tôi có vai trò CTX_SYS trong tầm tay) không?
  • có ai gợi ý tham số nào có thể được tinh chỉnh (đặc biệt là kích thước bộ nhớ)?
  • có thể xuất và nhập chỉ mục văn bản không? -> sau đó tôi có thể thực hiện lập chỉ mục trên máy cục bộ của mình và chỉ cần sao chép vào máy chủ của chúng tôi
  • trình lập chỉ mục có thể chạy với "mức độ ưu tiên thấp hơn" không?
  • có thể là người lập chỉ mục đã bị quấy rầy bởi các hoạt động khóa (đó là một máy phân tầng mà quyền truy cập của người khác song song). Có cách nào để khóa các bảng liên quan, tạo chỉ mục và mở khóa chúng sau đó không?

Trả lời

9

Cuối cùng, chúng tôi đã tìm ra cách thực hiện đồng bộ hóa chia nhỏ chỉ mục. Dưới đây là một số bước cơ bản thể hiện những gì chúng tôi đã làm:

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 
'); 

xem tham số NOPOPULATE? nói rằng người lập chỉ mục rằng nó không nên bắt đầu quá trình điền/lập chỉ mục. Nếu bạn đang trên 11g, bây giờ bạn có một tính năng CTX_DDL rất đẹp trong tay mà populates chỉ số theo ý muốn, cụ thể là thủ tục "POPULATE_PENDING". Gọi nó trên tên chỉ mục của bạn sẽ điền bảng CTXSYS chứa các hàng đã được sửa đổi và do đó không đồng bộ. Lưu ý rằng sau khi gọi phương thức này, người lập chỉ mục vẫn chưa bắt đầu bất cứ điều gì. Vì 10g (?) Theo quy trình CTX_DDL.SYNC_INDEX có một số tham số bổ sung, ví dụ: thông số "maxtime". Cung cấp cho nó, giả sử, 4H và người lập chỉ mục của bạn sẽ bắt đầu đồng bộ các hàng đang chờ xử lý trong khoảng 4 giờ. Bạn lặp lại quy trình đó theo lịch trình và được thực hiện.

Điều đó không hiệu quả trong 9i. Vì vậy, chúng tôi đã thử thành công để "mô phỏng" quy trình POPULATE_PENDING của Oracle. Hạn chế duy nhất trên phương thức này là: bạn cần một số loại định danh hàng duy nhất để có thể truy vấn các phần của cùng một nội dung từ bảng của bạn.Đây là những gì chúng tôi đã làm:

1.) Tạo chỉ mục bằng NOPOPULATE (xem bên trên) 2.) Trở thành SYS/DBA/CTXSYS (vâng, bạn có thể gọi quản trị viên của bạn cho điều đó). Tìm hiểu ID rằng chỉ số vừa tạo của bạn có bằng cách truy vấn bảng chỉ mục meta:

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

3.) lưu ý ID chỉ số này là năng suất trên một đoạn vàng của giấy và thực hiện tuyên bố này như chèn vai trò CTXSYS và thay thế số <> với id chỉ mục của bạn và <> với tên của bảng mà chỉ mục được tạo. Hàng độc đáo số nhận dạng có thể có một số loại ID tài liệu hay bất kỳ loại tuyên bố đếm được tạo ra một đoạn duy nhất của dữ liệu bảng của bạn:

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! 

các "50.000" đánh dấu số hàng tùy thuộc vào scarceness của bạn basetabel sẽ được chèn vào trong bảng hàng đang chờ xử lý dưới dạng tải trọng cho người lập chỉ mục. Điều chỉnh nó cho nhu cầu của riêng bạn.

4.) Bây giờ chúng tôi được thiết lập để cho trình lập chỉ mục bị mất.

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

sẽ bắt đầu quá trình lập chỉ mục trên bất kỳ số hàng bạn đã chèn vào trong bước 3.) Để chạy các đoạn lặp lại bước tiếp theo 3.) với 50.000 hoặc lâu hơn hàng tiếp theo ("nơi id giữa 50.000 và 100.000 ")

Nếu bạn vô tình chạy trình chỉ mục trên cùng một tập hợp các hàng, chỉ mục sẽ phân đoạn mạnh. Cách duy nhất để làm sạch nó là tối ưu hóa chỉ mục với tham số REBUILD. Trên máy tính địa phương của chúng tôi trở nên cực kỳ nhanh chóng kể từ khi indexer không phải chạy nhưng chỉ sắp xếp lại nội dung các bảng chỉ số:

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

Nếu bạn cần một số thông tin meta về tình trạng lập chỉ mục và kích thước mà bạn có thể yêu cầu CTX_REPORT gói:

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

Và nếu bạn quên thông số mà bạn đã chọn đúng thời hạn lập chỉ mục:

SELECT * FROM CTXSYS.CTX_PARAMETERS; 

Chúc mừng indexing!

+0

Cảm ơn bạn đã nghiên cứu. – egor7

+0

Đăng ký tuyệt vời, đã cho tôi nhiều tuần để tìm ra càng nhiều. Tuy nhiên, populate_pending POPULATES danh sách các cập nhật chỉ mục PENDING với TẤT CẢ hàng/tài liệu trong bảng nguồn. Oracle không có ý tưởng những gì có thể đã thay đổi, sau khi tất cả, theo dõi những gì đã thay đổi là chính xác những gì CTXSYS.DR $ PENDING là cho. Chỉ sử dụng điều này khi tạo chỉ mục hoặc nếu bạn muốn lập chỉ mục lại mọi thứ. – Roy

Các vấn đề liên quan