Oracle — Внутренний запрос требует времени

#sql #oracle

Вопрос:

У меня есть два вопроса:

 select * from PRE_DETAIL_REPORT a where item = (select item from apple_skus);
select * from PRE_DETAIL_REPORT a where item IN ('100299122');
 

таблица: APPLE_SKUS
содержит только один элемент: 100299122

Когда я запускаю первый запрос, выполнение занимает 2 минуты, Когда я запускаю второй запрос, выполнение занимает 3 секунды

В чем может быть причина?

Комментарии:

1. Запрос 1 также должен прочитать таблицу apple_skus.

2. в таблице есть только одна строка

3. Извини, пропустил эту часть. Сравните планы выполнения.

4. запустите объясните спланируйте и то и другое и опубликуйте результаты

5. Есть PRE_DETAIL_REPORT ли вид? Это APPLE_SKUS таблица, которая раньше была большой, но была удалена до одной строки — иногда одна строка может занимать много места на диске, если это пространство не было освобождено. Запустите этот запрос, чтобы узнать , сколько мегабайт дискового пространства используется для хранения одной строки данных: select bytes/1024/1024 mb from dba_segments where segment_name = 'APPLE_SKUS'; для создания планов объяснения выполните explain plan for select ... , а затем select * from table(dbms_xplan.display) для обоих запросов, а затем отредактируйте вопрос с планами.

Ответ №1:

вы можете переписать его таким образом:

 select a.* from PRE_DETAIL_REPORT a 
join apple_skus t on t.item = a.item;
 

Ответ №2:

Именно так работает синтаксис sql-запроса

У вас есть ручные значения для выбора во 2-м запросе, но в первом случае вы указали подзапрос, поэтому снова

ИЗ ПРЕДЛОЖЕНИЯ N ЗАТЕМ ВЫБЕРИТЕ so, Запрос таблицы займет больше времени, чем значение жесткого кода, даже если есть одна запись

Вы могли бы попробовать EXISTS, так как он использует коррелированный подзапрос, что было бы намного быстрее

     Select * from table  t1 where exists (select  1 from table 
    where 
     Item =t1.item)
 

Ответ №3:

Весьма вероятно, что разница связана с другим доступом к PRE_DETAIL_REPORT; и, как упоминалось ранее кем-то, план объяснения (или отчет SQL Monitor) подскажет вам ответ. Но пока вы не предоставите диагностику, это всего лишь предположение…