Объединение операторов 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;
.
и таблица имеет столбцы - a, b, id, timestamp, тип. Прямо сейчас я называю первый запрос от Java, возьмите вывод и цикл результатов, чтобы вызвать второй запрос для каждого типа, который был возвращен в первом запросе.
Мне нужны как мин (а), MAX (B) вещи из первого запроса и IO, считается от второго запроса.Можно ли сделать это в одном запросе?Я использую Amazon Redshift в качестве моей базы данных.
Решение
redshift довольно limited ОтказОн основан на 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