Оптимизация SQL-запросов Oracle

У меня есть этот SQL-запрос, который сначала выбирает из относительной короткой таблицы число, которое затем используется для другого выбора, на этот раз из очень большой таблицы, определенной информации с использованием кода из первой. Это занимает более 30 минут только для одного выбора, и мне нужно оптимизировать, так как мне нужно выполнить 300 таких выборок, но с разными SWNAME. Буду признателен за любые советы и подсказки, которые вы мне дадите. Спасибо !

SELECT SWOBJECTID 
FROM   MBR_INST_PRODUCTS 
WHERE  SWPRODRELEASEID IN 
       (SELECT SWPRODRELEASEID 
        FROM   ORO_PPY_OPTIONS 
        WHERE  SWNAME LIKE 'Nov Flexibil Offer:Net Unlimited for 1MON')
AND rownum <2;

Почему like и почему не SWNAME = 'Nov Flexibil Offer:Net Unlimited for 1MON'?

Kaushik Nayak 16.07.2018 10:22
SWNAME like 'Nov Flexibil Offer:Net Unlimited for 1MON' - это то же самое, что и SWNAME = 'Nov Flexibil Offer:Net Unlimited for 1MON'
a_horse_with_no_name 16.07.2018 10:25
Over 300 of these queries in a run - не могли бы вы отредактировать свой вопрос, чтобы добавить более подробную информацию о том, из чего состоит пробег? Например, возможно, что вам не нужно 300 запросов (может быть, один запрос может сделать работу), поэтому настройка каждого отдельного запроса может быть неправильным способом. Кроме того, что означает «очень много времени»? Какие индексы присутствуют в обеих таблицах? Какой план выполнения? Обновите свой вопрос, добавив эти дополнительные сведения, чтобы мы могли помочь вам лучше.
Boneist 16.07.2018 10:31

Отредактировал вопрос и поставил индексы и остальное.

VanG 16.07.2018 11:12
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
65
2

Ответы 2

Как насчет простого соединения?

SELECT m.swobjectid
  FROM mbr_inst_products m
       JOIN oro_ppy_options o ON o.swprodreleaseid = m.swprodreleaseid
 WHERE     o.swname = 'Nov Flexibil Offer:Net Unlimited for 1MON'
       AND ROWNUM < 2;

Убедитесь, что столбцы swprodreleaseid проиндексированы.

Я бы написал этот запрос как:

SELECT ip.SWOBJECTID 
FROM  MBR_INST_PRODUCTS ip JOIN
      ORO_PPY_OPTIONS po
      ON po.SWPRODRELEASEID = ip.SWPRODRELEASEID
WHERE po.SWNAME = 'Nov Flexibil Offer:Net Unlimited for 1MON') AND
      rownum = 1;

Для этого запроса вам нужны индексы на ORO_PPY_OPTIONS(SWNAME, SWPRODRELEASEID) и MBR_INST_PRODUCTS(MBR_INST_PRODUCTS).

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