2012-06-06 3 views
0

나는 A의 레코드가 B의 여러 레코드에 매핑되는 두 개의 테이블 A와 B를 가졌습니다. 테이블 A의 레코드와 매핑 된 모든 레코드를 보여주는 쿼리가 있습니다. 같은 한 줄의 테이블 B :오라클 1 : n 효율적인 쿼리

TABLE A 
-------- 
ID Name Tag ...... 
1 X 213 
2 Y 222 

TABLE B 
-------- 
ID ACCESS_AREA 
1  101 
1  104 
1  105 
2  101 
2  103 

쿼리는 같은 수 있습니다 :

위의 작품이지만, 쿼리의 성능이 모두 레코드의 수가 매우 낮은
SELECT ID, 
     Name, 
     Tag ,....., 
     (SELECT WM_CONCAT(ACCESS_AREA) 
      FROM B 
      WHERE ID = A.ID) Access_areas 
    FROM A 

테이블은 매우 큽니다. access_areas에서 필터링이나 정렬을 수행하면 성능이 더 떨어집니다.

단순한 조인이 될 수 있도록 mv가 값을 계산하기 위해 구체화 된 뷰를 사용한다고 생각했지만 mv는 집계 함수를 사용하여 이러한 쿼리에 대한 커밋을 빠르게 새로 고칠 수 없습니다.

또 다른 옵션은 B에서 계산 된 값이 들어있는 테이블 A에 열을 추가하고 변경이 완료된 경우 테이블 B에서 트리거를 사용하여 새 열을 업데이트하는 것입니다. 그러나 트리거가있는 동일한 테이블을 쿼리 할 수 ​​없기 때문에 이것은 또한 실현 가능하지 않습니다.

마지막 수단으로 두 번째 옵션을 구현하고 응용 프로그램 코드를 통해 열을 업데이트하기로 결정했습니다. 이는 매우 지루합니다.

아이디어가 있으십니까?

답변

1

쿼리에 대한 EXPLAIN 계획이나 테이블에 대한 인덱스가 표시되지 않았습니다. 그러나 더 중요한 것은이 데이터로 무엇을하고 있는지 알려주지 않은 것입니다. 왜 한 번에 많은 양의 데이터에 액세스해야합니까? 결과를 왜곡시킬 필요가있는 이유는 무엇입니까?

스냅 샷이 생성 된 이후 업데이트 된 구체화 된보기와 원시 데이터를 모두 포함하는보기를 만들 수 있지만 (데이터가 사용되는 방법에 대한 아이디어가 없거나 더 이상 유효하지 않은 업데이트 된 항목을 제거 할 수 있음) 업데이트 된 것이 아니라 세부 사항에 대한 조언이 실제로 가능하지 않습니다.

+0

미안하지만 내가 언급 한 시나리오는 내가 직면 한 시나리오와 닮았습니다. 실제로 두 개의 더 유사한 계산 된 열이 있습니다. 또한, 불행히도 디자인 사양에 대한 의견이 없습니다. – Rnet

+0

첫 번째 테이블과 관련 테이블의 모든 레코드를 단일 페이지에 나열하는 프런트 엔드 인터페이스가 있으므로 쿼리는 – Rnet

+0

입니다. '페이지'는 HTML을 의미합니까? 그런 다음 걱정하지 마십시오. 쿼리 성능 문제는 HTTP를 통해 전달하고 HTML을 사용하여 렌더링함으로써 생성되는 성능 문제와 비교할 때 ** 아무것도 없습니다 **. 귀하의 이력서를 연마하는 시간 – symcbean

0

LISTAGG 또는 COLLECT으로 바꾸십시오.

SQL과 PL/SQL간에 빈번한 컨텍스트 전환으로 인해 대규모 문자열 집계가 상당히 비쌀 수 있습니다. WM_CONCATSTRAGG은 매우 일반적이지만 매우 비효율적입니다. 11gR2를 사용하는 경우 항상 LISTAGG을 사용하십시오. 아직 11gR2를 사용하고 있지 않다면 COLLECT 방법을 사용하십시오. This page은 여러 가지 방법을 설명하고 성능 비교를합니다.

2. 구체화 된보기.

당신은 이미 그것을 시도했다는 것을 알고 있습니다. 나는 구체화 된 견해에 대해 많은 경험을 갖고 있지는 않지만,이 경우에는 효과가 있어야한다고 생각합니다. rowid materialized 뷰는 작동하지 않지만 primary key materialized view이어야합니다.

는 (그것을 방지 다른 구체적인 이유, 우리는 문제를 troublesheet 모든 세부 사항을 필요로 할 수있는 경우가 아니라면 : 테이블에 대한 전체 쿼리 및 DDL을보기를 구체화하고, 로그보기를 구체화.)

3. 계획을 설명하십시오.

언급 된 symcbean은 계획 문제 일 수 있습니다. 적은 수의 행만 사용하는 경우 인덱스가 사용됩니까? 그러나 Explain 계획 외에도이 쿼리에 대한 기대치를 알아야합니다. 쿼리에 2 초는 걸리지 만 200KB의 데이터가 반환되면 네트워크 또는 브라우저가 병목 현상이 될 수 있습니다.


# 2 또는 # 3이 도움이 될지 모르지만 항상 # 1을 구현해야합니다. 나는 WM_CONCATSTRAGG을 버그라고 생각합니다. 훨씬 더 좋은 대안이있을 때 사용할 이유가 없습니다.