Performance Oracle explain plan over simple select在表中为多个列编制索引时执行多个哈希联接
我当前遇到Oracle实例的问题。我有两个简单的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
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版本。