2017-04-20 1 views
0

PLSQL의 3 가지 다른 키에 대한 빠른 액세스를 위해 데이터를 메모리에 캐시하려고합니다. 문제는 포인터가있는 언어에서는 실제로 존재하지 않지만 PLSQL에 대해 내가 알고있는 어떤 것도 없기 때문에 고심하고 있습니다. 나는 아주 큰 루핑 함수를 가지고있어서 아주 세밀한 방법으로 데이터를 갱신하고, 그렇지 않으면 꽤 영원 할 것이기 때문에 이것을해야한다.레코드와 연결된 값을 업데이트하기위한 PLSQL 컬렉션에 대한 가장 빠른 액세스

기본 아이디어는 key_1별로 정렬 된 메모리에 컬렉션이 있다는 것입니다. 레코드 자체의 key_1 값과 컬렉션에서 동일한 key_2를 가지며 수정 한 레코드로 key_3 값을 가진 레코드의 다른 특정 값에 영향을주는 첫 번째 레코드의 값을 변경하려고합니다. 수정 후 나는 시간이 많이 걸리는 쿼리를 사용하는 대신 수정 된 첫 번째 행을 버블 링하여 버틸 수 있습니다.

create type t_num_tbl is table of number; 

create type rec_type as object 
(
key_1 number, 
key_2 varchar2(30), 
key_3 t_num_tbl  
); 

및 컬렉션은 다음과 같이이다 :

그래서 기본적으로 기록은 다음과 같다

create type rec_typetbl is table of rec_type; 

v_rectbl rec_typetbl := rec_typetbl(); 

내가 기록을 수정하면 내가 선택/업데이트를 제공해야 할 것이다 그 관련 레코드를 수정할 수 있도록 다음과 같이 표시됩니다.

SELECT * 
FROM table(v_rectbl)t 
WHERE t.key_2 = modifiedrec.key_2 
    AND 
    (SELECT count(*) 
    FROM table(t.key_3) 
    JOIN table(modifiedrec.key_3) USING (column_value)) > 1; 

데이터는 메모리에서 인덱싱되지 않으며 액세스가 내 목적에 충분히 빠르지 않습니다.

레코드의 포인터 배열을 컬렉션의 관련 요소에 사용하는 성능과 비교할 수있는 솔루션이 있습니까? key_2, key_3 값은 변경되지 않으므로 연관성은 미리 알 수 있습니다.

+1

아마도 응용 프로그램에는 과도한 것이지만 Oracle [TimesTen In-Memory Database] (http://www.oracle.com/technetwork/database/database-technologies/timesten/overview/index.html)을 확인하십시오. –

답변

0

먼저 디자인에 대해 권장 할 수 있으며 디자인 방식 (즉, 색인 된 액세스)에서 RDBMS를 사용하게됩니다.

그런데 모든 Oracle 테이블에는 행에 대한 포인터 인 rownum 의사 열이 있습니다 (즉, 인덱스가 내부적으로 테이블의 특정 행을 참조하는 방법). 레코드가 있으면 데이터 구조에 rownum을 저장하여 빠르게 되돌릴 수 있습니다 (테이블/행이 다시 구성 될 때 오라클이 rownum을 변경할 수 있으므로 오래 지속되지 않습니다).

+0

"오라클은 테이블/행이 다시 구성 될 때 rownum을 변경할 수 있으므로 장기간 지속하지 마십시오."약간 약하며 ROWID로 작업 할 때 FOR UPDATE를 사용하는 것이 좋습니다. 그런 행이 잠겨 있습니다. –

+0

아이디어는 견고하지만 잘못된 의사 열입니다. 각 행과 관련된 rowid입니다. Rownum은 처리를 위해 선택된대로 행에 지정됩니다. 동일한 쿼리의 다른 실행이 정확히 동일한 데이터를 반환 할 수 있지만 다른 행을 가진 각 행은 반환 될 수 있습니다. – Belayer

+0

당신의 생각/정정에 @WernfriedDomscheit에게 감사드립니다. –