2016-08-26 2 views
1

제 목적에 맞는 SQL 쿼리를 찾은 후에 쿼리가 느리다는 것을 알게되었습니다.SQL 쿼리를 일반화하고 빠르게 만듭니다.

  1. SQL 쿼리를 생성하고 데이터를 가져 오기 위해 matlab에 내에서 사용되는 다음과 같이 나는이 양식에 쿼리를 사용하는 이유

    WITH temp_table (t_col_1, t_col_2, t_col_3) AS 
    (
        SELECT col_1 AS t_col_1, col_2 AS t_col_2, col_3 AS t_col_3 
        FROM actual_table 
        WHERE ID = 100 AND PID = 1245 
    ) 
    SELECT t_col_1, t_col_2, t_col_3 
    FROM temp_table AS t1 
    WHERE t1.t_col_2 BETWEEN 1 AND 12541 
        AND t1.t_col_1 = (SELECT max(t2.t_col_1) 
            FROM temp_table AS t2 
            WHERE t2.t_col_1 < 15147 
             AND t2.t_col_2 = t1.t_col_2) 
    ORDER BY t1.t_col_2 
    

    이유이다.

  2. ID에 따라 col_1 및 col_2 열이 바뀌어 t_col_1 = col_2 및 t_col_2 = col_1 인 이유가 발생할 수 있습니다. 이 경우 Matlab 스크립트는 col_1 AS t_col_2 및 col_2 AS t_col_1을 대체합니다.

쿼리를 가속화하는 우아한 방법이 있습니까?

미리 감사드립니다.

답변

0

기본 쿼리가 WHERE 기준을 검사 할 때 최대 값이 t_col_1 인 쿼리가 모든 행에 대해 실행되고 있다는 문제가 있습니다. 대신 한 번 실행되는 서브 쿼리의 max(t2.t_col_1) 값을 생성 할 수 있습니다 다음과 같이 귀하의 기준에 해당 변수를 사용

SELECT PID, t1.t_col_1, t1.t_col_2, t1.t_col_3 
FROM 
    (SELECT PID, t_col_1, t_col_2, t_col_3, max(t2.t_col_1) AS t_col_1_max 
    FROM temp_table 
    GROUP BY PID, t_col_1, t_col_2, t_col_3) 
    as t1 
WHERE 
    (t1.t_col_2 BETWEEN 1 AND 12541) 
    AND t1.t_col_1 < 15147 
    AND t1.t_col_1 = t1.t_col_1_max 
ORDER BY t1.t_col_2 

임시 테이블을 생성하기위한 귀하의 코드가 잘 보인다.

+0

불행히도 위의 SQL 쿼리는 작동하지 않습니다. 내부 SELECT 문에 실수가있을 수 있습니까? 감사. – grima

+0

아마도 한 개의 댓글이 더 많습니다. t_col_1과 t_col_2가 날짜 일 때도 SQL 쿼리가 작동합니까? 내 쿼리의 숫자는 단지 예일뿐입니다. – grima

+0

@grima 아,'GROUP BY' 문을 잊어 버렸습니다. 이제 내부 쿼리가 작동합니다. 데이터가 날짜 일 경우 데이터로 작업 할 수 있는지 여부에 관해서는, 당신이 당신의 표본 샘플을 주면 더 잘 대답 할 수 있습니다. – Rominus

0

답변은 쿼리 최적화 프로그램과 데이터베이스 통계에 따라 달라지며 데이터베이스의 선택에 따라 달라집니다.

  1. QEP를 얻기 - 쿼리 실행 계획
  2. 참조 계획이
  3. 쿼리를 최적화 및/또는 데이터베이스 통계를 추가 및/또는 필요한 인덱스

당신이 시도 할 수 있습니다를 추가 느린 경우 쿼리를 조정할 수는 있지만 행운이 올 수 있지만 적절한 접근 방법은 쿼리 계획을 이해하는 것입니다.

예를 들어, 'max'가 느리거나 actual_table에 ID 및 PID에 대한 색인이없는 10 억 개의 행이 있는지 알 수있는 방법이 없습니다.

관련 문제