2008-09-30 8 views
2

나는 오라클에서 대규모 쿼리를 수행하는 기능을 최근에 접했습니다. 한 가지 변경으로 인해 10 시간이 소요되는 쿼리가 3 시간이 걸렸습니다.오라클 "해시 그룹"이 어떻게 작동하는지 설명 할 수 있습니까?

간략하게 요약하면, 각 좌표에는 확률이있는 많은 좌표가 데이터베이스에 저장됩니다. 그런 다음이 좌표를 50 미터 크기의 저장소 (기본적으로 가장 가까운 50 미터까지 좌표를 내림)로 '비우기'하고 확률을 합산합니다.

이렇게하려면, 쿼리의 일부는

처음 나는 확률 다수의 지점을 저장하고 ', Y, X가 기 ....에서 X, Y, 합 (확률)을 선택'이고 0.1이고 쿼리는 각각 10 분 정도 소요되었습니다.

그런 다음 배포본을 조정하기 위해 확률을 계산하는 방법을 변경하라는 요청이 있었기 때문에 모든 값이 0.1이 아니라 다른 값 (예 : 0.03, 0.06, 0.12, 0.3, 0.12, 0.06, 0.03) . 동일한 쿼리를 정확히 실행하면 약 3 시간의 쿼리가 발생했습니다.

모두 0.1로 돌아가서 쿼리를 10 분으로 되돌립니다.

시스템의 쿼리 계획 및 성능을 살펴보면 오라클의 그룹화 속도를 높이기 위해 설계된 '해시 그룹'기능이 문제가되는 것처럼 보였습니다. 각 고유 x, y, 확률 값에 대한 해시 항목을 생성 한 다음 고유 x, y 값에 대한 확률을 합산하는 것입니다.

아무도이 동작을 더 잘 설명 할 수 있습니까? 답변에

추가 정보

감사합니다. 그들은 내가 무슨 일이 있었는지 확인할 수있었습니다. 저는 현재 쿼리를 실행 중이고 v $ sql_workarea_active에서 tempseg_size가 현재 7502561280이고 빠르게 증가하고 있습니다.

실행중인 개발 서버에 8GB의 RAM 만 있으면 주어진 쿼리가 임시 테이블을 사용해야하는 것처럼 보입니다.

나는 쿼리 유형을 변경하고 일부 정보를 미리 계산하여 해결할 수있었습니다.

+0

늦은 생각 : 파티션 옵션을 사용하면 각 버킷 값 x가 단일 파티션에만 포함될 수 있도록 범위 파티션을 지정할 가치가있을 수 있습니다 (범위 분할이 실제로 작동하는 유일한 방법 임). 그런 다음 각각의 단일 파티션을 처리하는 모든 집계 쿼리를 조합에 쿼리를 재구성합니다. 이것은 각 파티션의 집합에 대한 메모리 소비를 줄이고 메모리에서 실행할 수있게합니다. –

답변

3

해시 그룹 (및 해시 조인 및 정렬과 같은 다른 연산)은 최적 (즉, 메모리 내), 원 패스 또는 다중 패스 방법을 사용할 수 있습니다. 마지막 두 메서드는 TEMP 저장소를 사용하므로 훨씬 느립니다.

가능한 항목 수를 늘리면이 유형의 작업에 예약 된 메모리에 들어갈 항목 수가 초과되었을 수 있습니다.

쿼리가 실행되는 동안 v $ sql_workarea_active를보고이 경우인지 확인하십시오. 또는 역사적인 정보를 보려면 v $ sql_workarea를보십시오. 또한 작업에 필요한 메모리 및/또는 임시 공간의 양을 알려줍니다.

실제 문제로 판명되면 가능한 경우 pga_aggregate_target 초기화 매개 변수를 늘리십시오. 최적의 해시/정렬 작업에 사용할 수있는 메모리 양은 대개 pga_aggregate_target의 약 5 %입니다.

자세한 내용은 Performance Tuning Guide을 참조하십시오.

3

"각각의 고유 한 x, y, 확률 값에 대한 해시 항목을 생성 한 다음 각 고유 x, y 값에 대한 합계 확률"을 추측합니다. 쿼리가 요구하는 것이므로 거의 확실합니다.

설명 플랜을 사용하여 임시 dfisk 공간에서 정렬 또는 그룹화 (기타)를 완료해야하는 쿼리의 가능성을 확인할 수 있습니다. 최적화가 제대로 통계에서 x와 다음 두 번째 쿼리의 출력의 TempSpc 열에서 얼마나 당신을 보여줄 것입니다 꽤 좋은 기회가 Y의 조합의 대략적인 고유 번호를 추론 할 수있는 경우

explain plan for 
select x,y,sum(probability) from .... group by x,y 
/

select * from table(dbms_xplan.display) 
/

디스크 공간 (있는 경우)은 쿼리를 완료하는 데 필요합니다 (열 없음 = 디스크 공간 필요 없음). 너무 많은 정보 여기

방법 : CaptP 말한대로 임시 공간 사용 후 높은 http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_xplan.htm#i999234

경우, 일부 메모리 tweakage 시간이 될 수 있습니다. 많은 정렬 및 집계를 수행하는 데이터베이스에서 SGA 대상보다 높은 PGA 대상을 지정하는 것이 일반적입니다.

0

언제든지 PGA_AGGREGATE_TARGET이 0으로 설정되어 있습니까? 문제를 일으킨 것은 해시 그룹 (HASH GROUPBY) 자체 일 가능성은 거의 없습니다. OPTIMIZER_FEATURES_ENABLE을 10.1.0.4로 다운 그레이드하고 쿼리를 다시 실행하십시오. 이제는 PGA 크기가 MANUAL 및 해시로 설정되어 있지 않으면 해시 그룹에서 성능이 우수한 SORT GROUPBY를 얻을 수 있습니다. 작업 영역이 작다.

+1

음, 해시 그룹을 사용하지 않도록 숨겨진 매개 변수가 있습니다 ... 이름을 지금 기억할 수는 없습니다 ... –

관련 문제