0

現在、Oracleインスタンスで問題が発生しています。2つの簡単なselectステートメントがあります。

select * from dog_vets  

select * from dog_statuses

そして次のフィドル

私の説明計画dog_vetsは次のとおりです。

 0 | Select Statement  
 1 | Table Access Full Scan dog_vets

私の説明計画dog_statuses は次のとおりです。

ID|Operation | Name | Rows |Bytes | cost | time    
0 | Select Statement |  | 20G | 500M | 100000 | 999:99:17  
1 | View  | index%_join_001 | 20G | 500M | 100000 | 999:99:17  
2 | Hash Join  |  | | | |   
3 | Hash Join  |  | | | |   
4 | Index fast full scan dog_statuses_check_up  |  | 20G | 500M | 100000 | 32:15:00  
5 | Index fast full scan dog_statuses_sick|  | 20G | 500M | 100000 | 35:19:00  

このタイプの出力を取得するには、次のステートメントを実行します。

explain plan for   
select * from dog_vets;

また

 explain plan for   
    select * from dog_statuses;

その後

select * from table(dbms_xplan.display);

さて、私の質問は、なぜ複数のインデックスが上記のステートメントで作成されたビュー(私が想定する具体化されたもの)を意味し、さらにこのタイプのクエリでどのタイプのパフォーマンスヒットに苦しんでいるのですか?現在のところ、約dog_vets3億件のレコードがあり、dog_Statuses約5億件のレコードがあります。select * from dog_statuses私はまだ10時間以内に戻ることができていません。これは主に、クエリが完了する前にクエリが終了するためです。

DDL

SQLフィドルが死んだ場合:

create table dog_vets
(
     name varchar2(50),
     founded timestamp,
     staff_count number
  );

create table dog_statuses
(
      check_up timestamp,
      sick varchar2(1)
  );


create index dog_vet_name
on dog_vets(name);

create index dog_status_check_up
on dog_statuses(check_up);

create index dog_status_sick
on dog_statuses(sick);
4

1 に答える 1

0

インデックスを忘れるようにオプティマイザに指示することができます

 SELECT /*+NO_INDEX(dog_statuses)*/ *
 FROM dog_statuses
于 2012-10-19T15:32:16.217 に答える