Performance Oracle explain plan over simple select在表中为多个列编制索引时执行多个哈希联接

Performance Oracle explain plan over simple select在表中为多个列编制索引时执行多个哈希联接,performance,oracle,database-design,data-warehouse,Performance,Oracle,Database Design,Data Warehouse,我当前遇到Oracle实例的问题。我有两个简单的select语句: select * from dog_vets 及 以及以下 我对dog_-vets的解释计划如下: 0 | Select Statement 1 | Table Access Full Scan dog_vets ID|Operation | Name | Rows |Bytes | cost | time 0 | Select Statement | | 20G | 500M | 100000 | 9

我当前遇到Oracle实例的问题。我有两个简单的select语句:

select * from dog_vets  

以及以下

我对
dog_-vets
的解释计划如下:

 0 | Select Statement  
 1 | Table Access Full Scan dog_vets
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  
我对狗的状态的解释计划如下:

 0 | Select Statement  
 1 | Table Access Full Scan dog_vets
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;

然后

select * from table(dbms_xplan.display);
现在我的问题是,为什么多个索引意味着在我的上述语句中创建了一个视图(我假设是物化的),而且我在这种类型的查询中受到了什么类型的性能影响?目前,
dog_-vets
拥有约3亿条记录,
dog_-status
拥有约5亿条记录。我还没能在10小时内从狗的状态中得到
select*
。这主要是因为查询在完成之前就结束了

DDL

如果sql fiddle死亡:

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);

您可以尝试告诉优化器忘记索引

 SELECT /*+NO_INDEX(dog_statuses)*/ *
 FROM dog_statuses

您确定
dog\u status
是一个表吗?也许这确实是一种观点。
从object\u name='DOG\u status'的所有对象中选择object\u type是什么返回?它返回我数据库中的表。你能显示完整的执行计划吗?顺便问一下:你打算如何处理你检索到的5亿行?您不可能将它们保存在内存中或向用户显示。我正在谈论每个步骤的细节。如果
DOG_status
确实是一个表,那么肯定有原因,只有通过详细完整的执行计划才能看到这一点。@Woot4Moo:我想我们需要的是更自信的是,我们所看到的代码实际上就是导致问题的代码。就我个人而言,我希望看到从生产系统粘贴的dog_vet和dog_状态的SQL DDL。粘贴的那个词很重要。另外,请告诉我们导致问题的系统上使用的Oracle版本。