Задать вопрос
dmtrbskkv
@dmtrbskkv
Кодим и декодим, а иногда кино смотрим

Как оптмизировать INSERT-SELECT SQL запрос?

Есть такой запрос:
INSERT INTO table0 (row_1, row_2, row_3, row_4)
SELECT t1.row_5,
       t1.row_6,
       t1.row_7,
       t2.row_8
FROM table1 t1
       LEFT JOIN table2 t2 on t2.row_9 = t1.row_10
WHERE t2.row_11 IS NOT NULL;


Всего 500+ тыс строк. Время выполнения 21 минута.

Как можно уменьшить это время? Каким образом можно оптимизировать запрос?
  • Вопрос задан
  • 142 просмотра
Подписаться 1 Средний 7 комментариев
Решения вопроса 1
mayton2019
@mayton2019
Bigdata Engineer
Как всегда автор не указывает тип dbms. Ох-ох-ох..

Запрос состоит из двух функционалов. Один - это собственно выборка - и другой это вставка.
Скорее всего медленно работает выборка в части соединения двух таблиц.
INSERT INTO tabel0 (row_1, row_2, row_3, row_4)
SELECT oa.row_5,
       oa.row_6,
       oa.row_7,
       nw.row_8
FROM table1 t1
       LEFT JOIN table2 t2 on t2.row_9 = t1.row_10
WHERE t2.row_11 IS NOT NULL;

Вот здесь где идет join по row_9 и row_10 надо построить индексы по этим полям.
Потом прогнать analyze по обоим таблицам.

И запустить еще раз.

Вставка тоже может тормозить по разным условиям (триггеры, instead-of триггеры, сложные констрейнты
или просто сложные типы данных наподобие xml/json которые требуют много I/O). Но для начала
надо хотя-бы с выборкой разобраться.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы