Oracle Text 인덱싱 속도를 높이거나 인덱서가 낮은 로드 시간에만 작동하도록 합니다.
우리는 오라클 텍스트 CTXSYS를 사용하고 있습니다.메타 정보를 포함하는 약 50만 행을 인덱싱하는 CONTEX 인덱스입니다.정보는 인덱서가 런타임에 호출하는 프로시저(기능 인덱스)에 의해 결합된 두 테이블에 분산됩니다.
로컬 컴퓨터(단순 듀얼 코어 노트북)에서 CREATE INDEX를 실행하면 약 3분 만에 인덱스가 만들어집니다.8개의 코어와 16G의 RAM을 갖춘 Solaris에서 실행되는 DB 서버에서 동일한(정확히 동일한) 데이터에 대한 인덱스를 생성하는 데 24시간이 걸립니다.
샘플 코드:이것은 테이블 2개와 컬럼 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 미만의 텍스트가 포함된 짧은 설명으로 구성됩니다.
관련 메모리 설정과 PARALLARE 파라미터로 조금 재생해 보았지만 성공하지 못했습니다.그래서 제 질문은 이렇습니다.
- 인덱싱 프로세스를 일시 중지하고 다시 시작하는 방법이 있습니까(CTX_SYS 역할이 수중에 있습니다)?
- 메모리 크기를 제외하고 어떤 매개 변수를 조정할 수 있는지에 대한 힌트가 있습니까?
- 텍스트 색인을 내보내고 가져오는 것이 가능합니까? -> 그러면 저는 제 로컬 컴퓨터에서 색인을 수행하고 그것을 우리 서버에 복사할 수 있습니다.
- 인덱서를 "낮은 우선 순위"로 실행할 수 있습니까?
- 인덱서가 잠금 작업(다른 사용자가 병렬로 액세스하는 준비 기계)으로 인해 방해를 받았을 수 있습니다.관련 테이블을 잠그고 인덱스를 만든 다음 나중에 잠금을 해제할 수 있는 방법이 있습니까?
우리는 마침내 인덱스의 분할된 동기화를 수행하는 방법을 알아냈습니다.다음은 우리가 수행한 작업을 보여주는 몇 가지 기본 단계입니다.
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
');
NOPOPUPLATE 매개변수가 표시됩니까?인덱서가 채우기/인덱스 프로세스를 시작하면 안 된다는 메시지를 표시합니다.만약 당신이 11g에 있다면, 당신은 이제 자유롭게 색인을 채우는 매우 멋진 CTX_DDL 기능, 즉 "POPULATE_PENDING" 절차를 손에 쥐고 있을 것입니다.인덱스 이름으로 호출하면 수정되어 동기화되지 않은 행이 들어 있는 CTXSYS 테이블이 채워집니다.이 메서드를 호출한 후 인덱서는 여전히 아무것도 시작하지 않았습니다.10g(?)부터 해당 CTX_DDL.SYNC_INDEX 프로시저에는 "maxtime" 파라미터와 같은 몇 가지 추가 파라미터가 있습니다.예를 들어, 4H를 제공하면 인덱서가 약 4시간 동안 보류 중인 행을 동기화하기 시작합니다.일정에 따라 해당 절차를 반복하면 완료됩니다.
불행하게도 그것은 9i에서 작동하지 않습니다.따라서 Oracle PUPLET_PENDING 프로세스를 "시뮬레이션"하는 데 성공했습니다.이 방법에 대한 유일한 제한 사항은 테이블에서 동일한 내용의 청크를 쿼리할 수 있으려면 일종의 고유 행 식별자가 필요하다는 것입니다.우리가 한 일은 다음과 같습니다.
1.) NOPOPULATE로 인덱스 생성(위 참조) 2.SYS / DBA / CTXSYS가 됩니다(예, 관리자에게 문의할 수도 있습니다).인덱스 메타 테이블을 쿼리하여 새로 만든 인덱스의 ID를 확인합니다.
SELECT IDX_ID FROM CTXSYS.CTX_INDEXES WHERE IDX_NAME ='concat_DM_RV_idx';
3.) 노란색 스니펫 종이에 생성되는 인덱스 ID를 기록하고 이 삽입문을 CTXSYS 역할로 실행하고 인덱스 ID를 사용자의 인덱스 ID로, 인덱스를 기반으로 하는 테이블의 이름을 사용자의 인덱스 ID로 바꿉니다.고유 행 식별자는 테이블의 고유한 데이터 청크를 만드는 문서 ID 또는 모든 종류의 카운트 가능한 문일 수 있습니다.
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개 이상의 행(여기서 id는 50.000과 100.000 사이)에서 3단계를 반복합니다.
실수로 인덱서를 동일한 행 집합에서 실행하면 인덱스가 강하게 조각납니다.정리할 수 있는 유일한 방법은 REBUILD 매개 변수를 사용하여 인덱스를 최적화하는 것입니다.인덱서를 실행할 필요가 없고 인덱스 테이블의 내용만 재정렬하기 때문에 매우 빠른 로컬 컴퓨터에서:
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;
행복한 색인 작성!
언급URL : https://stackoverflow.com/questions/3298864/speed-up-oracle-text-indexing-or-let-the-indexer-work-only-on-low-load-times
'programing' 카테고리의 다른 글
내용에 셀 너비 맞춤 (0) | 2023.08.02 |
---|---|
NodeJS 암호화와 함께 SHA-256 사용 (0) | 2023.08.02 |
Python 코드를 PEP8 호환으로 변환하는 도구 (0) | 2023.08.02 |
Div 너비 100% - 고정 픽셀 수 (0) | 2023.08.02 |
한 번에 여러 프레임의 부트스트랩 회전각 (0) | 2023.08.02 |