Медлительность в SQL-запросе с подзапросом
Мой SQL-запрос становится слишком медленным, когда в предложении WHERE добавляется подзапрос , даже если время выполнения отдельных запросов составляет менее 1 минуты. Запрос имеет следующий скелет
SELECT COL1, COL2, COL3, COL4, COL5, COL6, sum(COL7) FROM TABLE1
WHERE Col1 = 'something' AND COl2 = date AND Col3 = (SELECT MAX(COLUMN1) FROM TABLE2)
GROUP BY COL1, COL2, COL3, COL4, COL5, COL6
Этот запрос выполняется на SYBASE IQ.
Данные для таблицы 1 составляют более 60 миллионов строк, а после применения условий фильтрации — всего 60 строк, выполнение которых обычно занимает 50 секунд, если подзапрос заменен жестко заданным значением.
Данные для таблицы 2 — это 200 строк, а после применения условия фильтра — всего одно целочисленное значение, выполнение которого по отдельности занимает 1 секунду.
2 ответа
Переместите подзапрос в
FROM
пункт:
SELECT t1.COL1, t1.COL2, t1.COL3, t1.COL4, t1.COL5, t1.COL6, sum(t1.COL7)
FROM TABLE1 t1 JOIN
(SELECT MAX(COLUMN1) as max_column1 FROM TABLE2) t2
ON t2.max_column1 = t1.date
WHERE Col1 = 'something' AND COl2 = date
GROUP BY COL1, COL2, COL3, COL4, COL5, COL6 ;
Затем вам нужны индексы:
-
table1(col1, col2, date)
-
table2(column1)
.
Вы можете переместить подзапрос в выборку, а затем использовать предложение соединения и посмотреть, поможет ли это.
SELECT max(COLUMN1), COL1, COL2, COL3, COL4, COL5, COL6, sum(COL7)
FROM TABLE1 t1 join TABLE2 t2
on t1.Col3 = t2.COLUMN1
WHERE Col1 = 'something' AND COl2 = date
GROUP BY COLUMN1, COL1, COL2, COL3, COL4, COL5, COL6
Не то чтобы вы использовали параметры, но это звучит странно, как прослушивание параметров.