2017-02-07 4 views
1

Я имею простой запрос с примкнули все столбцы индексируются, но до сих пор я получаю полное сканирование таблицы Ниже приведен запрос,запрос делает полный просмотр таблицы, даже с индексами

select rsb.REP_STATUS_BRIDGE_ID 
    from REP_STATUS_BRIDGE_DETAILS rsd, 
     rep_status_bridge rsb 
    where rsd.REP_STATUS_BRIDGE_ID = rsb.REP_STATUS_BRIDGE_ID; 

столбцы REP_STATUS_BRIDGE_ID индексируется в обоих таблицы, после это объяснить план

Explain plan at the following link

Пожалуйста, помогите мне в решении этого вопроса

Как многие люди спрашивали это запрос, который принимает навсегда, чтобы загрузить

select count(rsb.REP_STATUS_BRIDGE_ID) from 
pcfc_dba.rep_pass rp, 
pcfc_dba.rep_status_bridge rsb, 
pcfc_dba.REP_STATUS_BRIDGE_DETAILS rsd, 
pcfc_dba.rep_status_ref rsf 
where trunc(rp.APPR_ACTION_END_DATE)>=to_date('01/02/2017','dd/MM/yyyy') 
and trunc(rp.APPR_ACTION_END_DATE)<=to_date('06/02/2107','dd/MM/yyyy') 
and rp.REP_STATUS_BRIDGE_ID = rsb.REP_STATUS_BRIDGE_ID 
and rsb.REP_STATUS_BRIDGE_ID=rsd.REP_STATUS_BRIDGE_ID 
and rsf.REP_STATUS_REF_ID=rsd.REP_STATUS_REF_ID; 

The explain plan

+0

Поскольку никаких условий ID не существует, одна таблица будет считана от начала до конца, индекс будет искать другую таблицу. – jarlh

+0

Почему соединение? Почему бы не использовать существо? Кроме того, устаревший синтаксис соединения - hella bad nowadays – JohnHC

+0

Это выглядит как разумный план выполнения для меня. У вас проблема с производительностью? Если да, можете ли вы его перечислить? – BobC

ответ

0

Я думаю, что главная проблема заключается в черствый статистики, как было сказано выше. Таблица REP_STATUS_BRIDGE_DETAILS имеет 1.3 mil записей, как вы сказали ранее. Но в плане мы видим, что полное сканирование таблицы ожидает получить только 310 строк (я полагаю, это строки, но я не вижу заголовок). Не могли бы вы собрать статистику ес .:

begin 
DBMS_STATS.GATHER_TABLE_STATS (
    ownname   => USER, 
    tabname   => 'REP_STATUS_BRIDGE_DETAILS', 
    cascade   => true); 
end; 
/

, а затем проверить num_rows из all_tables зрения

select t.owner, t.table_name, t.num_rows 
    from all_tables t 
where t.table_name in ('REP_STATUS_BRIDGE_DETAILS'); 

Это принимать данные счета Статистика по. После того, как статика будет собрана, вы должны получить разные планы для обоих запросов.

+0

Спасибо, что эта старая статистика была проблемой. Спасибо всем за вашу поддержку. – onlinejava

 Смежные вопросы

  • Нет связанных вопросов^_^