2013-07-25 3 views
0

내 응용 프로그램을 사용하면 사용자가 실험의 일부로 측정 데이터를 수집 할 수 있으며 이전에 수행 된 모든 측정에 대해보고 할 수 있어야합니다. (18) 사용자가 각각 2,000 실험, 거기에 내 데이터베이스에서오라클 11g - 수백만 행의 분석 기능 수행

CREATE TABLE EXPERIMENTS(
    EXPT_ID INT, 
    EXPT_NAME VARCHAR2(255 CHAR) 
); 

CREATE TABLE USERS(
    USER_ID INT, 
    EXPT_ID INT 
); 

CREATE TABLE SAMPLES(
    SAMPLE_ID INT, 
    USER_ID INT 
); 

CREATE TABLE MEASUREMENTS(
    MEASUREMENT_ID INT, 
    SAMPLE_ID INT, 
    MEASUREMENT_PARAMETER_1 NUMBER, 
    MEASUREMENT_PARAMETER_2 NUMBER 
); 

:

다음은 아주 간단 내가 가지고있는 테이블의 버전입니다. 각 사용자는 측정 할 6 개의 샘플을 가지고 있으며 샘플 당 100 개의 측정을 수행합니다.

즉, 현재 데이터베이스에 저장되어있는 측정 값은 2000 * 18 * 6 * 100 = 21600000입니다.

각 사용자에 대해 측정 매개 변수 1과 2의 AVG()를 얻는 쿼리를 작성하려고합니다. 이는 약 36,000 개의 행을 반환합니다.

내가 사용하는 쿼리는 매우 느립니다. 30 분 이상 실행 한 상태로 돌아 왔지만 아무 것도 반환하지 않습니다. 내 질문은 : 평균을 얻는 효율적인 방법이 있습니까? 합리적인 시간 (예 : 2 분)에이 양의 데이터에 대한 결과를 실제로 얻을 수 있습니까? 아니면 내가 비현실적입니까?

SELECT 
    E.EXPT_ID, 
    U.USER_ID, 
    AVG(MEASUREMENT_PARAMETER_1) AS AVG_1, 
    AVG(MEASUREMENT_PARAMETER_2) AS AVG_2 
FROM 
    EXPERIMENTS E, 
    USERS U, 
    SAMPLES S, 
    MEASUREMENTS M 
WHERE 
U.EXPT_ID = E.EXPT_ID 
AND S.USER_ID = U.USER_ID 
AND M.SAMPLE_ID = S.SAMPLE_ID 
GROUP BY E.EXPT_ID, U.USER_ID 

이 각 expt_id/USER_ID 조합 2 개 측정 매개 변수의 평균에 대한 행을 반환합니다

여기에 (다시 단순화 된 버전) 내가 가지고있는 쿼리입니다.

+0

이것은 분석 함수가 아닌 집계이며, (분석 함수처럼) 수백만 행에서 제대로 작동해야합니다. 즉각적인 혐의로 어떤 DDL도 게시하지 않았기 때문에 아무 것도 없다는 것입니다 ... 당신과 그 사람들은 무엇입니까? – Ben

답변

1

귀하의 질의에 대해 어떠한 경우에도 DBMS는 전체 측정 테이블을 읽어야합니다. 이것은 읽어야 할 데이터의 가장 큰 부분이며, 쿼리가 잘 최적화 된 경우 (나중에 올 것입니다) 대부분의 시간이 걸리는 부분입니다. 즉, 쿼리의 최소 런타임은 저장된 모든 테이블에서 전체 측정 테이블을 읽는 데 걸리는 시간과 관련됩니다. 얼마나 많은 양의 데이터 (MB 또는 GB)를 확인하고이 데이터 양을 하드 디스크 (또는 테이블이 저장된 위치)에서 읽는 데 걸리는 시간을 확인하여 대략적인 견적을 얻을 수 있습니다. 쿼리가 5 배 이상 느리게 실행되는 경우 최적화 할 여지가 있는지 확인할 수 있습니다.

Oracle 쿼리를 최적화하는 방법에 대한 방대한 양의 정보 (자습서, 귀중한 개별 힌트 및 일반 사례 목록)가 있습니다. 이 모든 정보를 신속하게 처리 할 수는 없습니다. 그러나 쿼리 실행 계획 (오라클의 쿼리 최적화 프로그램이 쿼리를 수행하는 최선의 방법이라고 생각하는 쿼리 계획)을 제공하면 최적화 할 수있는 단계를 발견하고 솔루션을 제안 할 수 있습니다.