Combinando instruções SQL para otimizar
-
20-12-2019 - |
Pergunta
Eu tenho 2 consultas diferentes na mesma tabela.O primeiro tem o formato -
SELECT MIN(A) AS MIN_A, MAX(B) AS MAX_B
FROM myTable
WHERE timeStamp > ?
GROUP BY type;
E o outro:
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;
E a tabela possui colunas - A, B, id, carimbo de data / hora, tipo.No momento, chamo a primeira consulta de java, pego a saída do conjunto de resultados e faço um loop sobre ela para chamar a segunda consulta para cada tipo que foi retornado na primeira consulta.
Preciso das coisas MIN(A), MAX(B) da primeira consulta e das contagens io da segunda consulta.É possível fazer isso em uma consulta?Estou usando o Amazon Redshift como meu banco de dados.
Solução
Redshift é bastante limitado.É baseado no PostgreSQL 8.0.2 e muitos novos recursos não são suportados.Isso deve funcionar (não testado):
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;
Dependendo da distribuição dos dados, isso pode ser mais rápido ou não:
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;