#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) подскажет вам ответ. Но пока вы не предоставите диагностику, это всего лишь предположение…