SQL 문을 결합하여 최적화합니다
-
20-12-2019 - |
문제
동일한 테이블에 2 개의 다른 쿼리가 있습니다.첫 번째는 형식입니다 -
SELECT MIN(A) AS MIN_A, MAX(B) AS MAX_B
FROM myTable
WHERE timeStamp > ?
GROUP BY type;
.
및 다른 하나 :
SELECT SUM (CASE WHEN io > 0 THEN 1 ELSE 0 END) as io_cnt
FROM (
SELECT
(CASE WHEN SUM(io_ops) > 0 THEN 1 ELSE 0 END) as io
FROM myTable
WHERE timestamp > ? AND type = ?
GROUP BY id
) t;
.
및 테이블에는 columns - a, b, id, timestamp, type. 지금은 Java에서 첫 번째 쿼리를 호출하고 ResultSet 출력을 가져 와서 첫 번째 쿼리에서 리턴 된 모든 유형에 대해 두 번째 쿼리를 호출하여 루프를 루프합니다.
첫 번째 쿼리에서 최소한 (a), max (b) 것들을 모두 필요하며 두 번째 쿼리에서 IO가 계산됩니다.하나의 쿼리에서 할 수 있습니까?Amazon Redshift를 데이터베이스로 사용하고 있습니다.
해결책
Redshift는 꽤 제한적입니다 ...에PostgreSQL 8.0.2를 기반으로하며 많은 새로운 기능은 지원되지 않습니다.이것은 작동해야합니다 (테스트되지 않은) :
SELECT t.type, min(min_a) AS min_a, max(max_b) AS max_b
,count(io > 0 OR NULL) AS io_cnt
FROM (
SELECT type, min(a) as min_a, max(b) as max_b
,sum(io_ops) AS io
FROM myTable
WHERE timestamp > ?
GROUP BY type, id
) t
GROUP BY t.type;
.
데이터 배포에 따라 더 빠르거나 아닙니다.
SELECT t.type, m.min_a, m.max_b, count(io > 0 OR NULL) AS io_cnt
FROM (
SELECT type, sum(io_ops) AS io
FROM myTable
WHERE timestamp > ?
GROUP BY type, id
) t
JOIN (
SELECT type, min(a) as min_a, max(b) as max_b
FROM myTable
WHERE timeStamp > ?
GROUP BY type
) m USING (type)
GROUP BY t.type, m.min_a, m.max_b;
. 제휴하지 않습니다 StackOverflow