我目前遇到了我的 Oracle 实例的问题。我有两个简单的选择语句:
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_vets
有大约 3 亿条记录和dog_Statuses
大约 5 亿条记录。我还没有能够select * from dog_statuses
在 10 小时内返回。这主要是因为查询在完成之前就终止了。
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);