Медлительность в 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 

Не то чтобы вы использовали параметры, но это звучит странно, как прослушивание параметров.

Другие вопросы по тегам