Oracle 为什么不用我的索引呢?
Table Device (
device_id number PK, //Sequence生成的long 型数字,但没不是 Number(10),当初为什么这样也不知道,
remark number not null, // 0 , 1 标记删除。
name varchar ,
deviceZL varchar(2), // 种类.
makeDate date,
)
Table Boiler (
boiler_id number(10) PK, // 子表,与Device 通过 device_id = boiler_id 关联.
power number(7,2) ,
model varchar2(30).
...
)
这2表还有些字段上有索引和外键,但是我的查询中不用。
Device = 330000 条,
Boiler = 5 0000 条记录。
select * from device d,vessel v
where d.device_id=v.vessel_id and d.remark=0
使用 first_rows 时,它显示使用 PK_BOILER 一个索引,
select * from device d,vessel v
where d.device_id=v.vessel_id and d.remark=0 and model = 'A0304023M35'
这个时候 first_rows 它显示使用 PK_DEVICE 索引。
我认为 DEVICE 数据量更大,如果用 PK_DEVICE 应该会更快些。
我不明白为什么它不优先使用 PK_DEVICE 而用 PK_BOILER ,跟 DEVICE_ID 和 BOILER_ID 类型不完全一致有关系么?
好像在 BOILER 上多加条件时,PK_DEVICE 被使用的概率更高,不知道为什么,现在我知道 select count(*) from device 肯定 是 select count(*) from boiler 的 7 ~ 20 倍.
我应该怎么让 Oracle 总是优先使用 PK_DEVICE , 而且两个主键出现在关联中,好像也没有看到同时用上2 个主键?
1:
select * from device d,vessel v
where d.device_id=v.vessel_id and d.remark=0
SELECT STATEMENT, GOAL = FIRST_ROWS 113221 111327 65126295
NESTED LOOPS 113221 111327 65126295
TABLE ACCESS FULL NEWSJJC DEVICE 1894 111327 45755397
TABLE ACCESS BY INDEX ROWID NEWSJJC VESSEL 1 1 174
INDEX UNIQUE SCAN NEWSJJC PK_VESSEL 1
2:
select * from device d,vessel v
where d.device_id=v.vessel_id and d.remark=0 and v.radius = 3
SELECT STATEMENT, GOAL = FIRST_ROWS 399 83 48555
NESTED LOOPS 399 83 48555
TABLE ACCESS FULL NEWSJJC VESSEL 316 83 14442
TABLE ACCESS BY INDEX ROWID NEWSJJC DEVICE 1 1 411
INDEX UNIQUE SCAN NEWSJJC PK_DEVICE 3