考虑以下SQL语句:
select *
from chamado.servico se
join chamado.chamado ch on ch.id_servico=se.id_servico
join chamado.statuschamado sc on sc.id_statuschamado=ch.id_statuschamado
where sc.id_statuschamado=1
;
现在考虑相应的执行计划:
现在请密切注意红色框上的红色!过滤谓词(CH.ID_STATUSCHAMADO=1
)。它不在查询中,它是最昂贵的操作。
表SERVICO
的行少于200行,表STATUSCHAMADO
的行少于10行,而表CHAMADO
的行却超过70000行。
我的意图是仅在STATUSCHAMADO和SERVICO上进行全表扫描的那些联接,这对Oracle造成了轻微的开销。
我的陈述有什么问题?
我有以下索引:
答案 0 :(得分:3)
“过滤器谓词(CH.ID_STATUSCHAMADO = 1)...不在查询中”-可能不是直接存在,但这确实在发生。您要在MealsPage
上将STATUSCHAMADO sc
加入CHAMADO ch
,然后在sc.ID_STATUSCHAMADO = ch.ID_STATUSCHAMADO
子句中有WHERE
。数据库足够聪明,可以确定sc.ID_STATUSCHAMADO = 1
始终为1,因此可以替代sc.ID_STATUSCHAMADO
。您也可以尝试反转STATUSCHAMADO上新索引上的字段-尝试使用CHAMADO.ID_STATUSCHAMADO = 1
和(ID_STATUSCHAMADO, ID_SERVICO)
。祝你好运。