如何在Oracle 12.1.0.2中优化此查询?

时间:2019-07-04 15:47:15

标签: oracle oracle12c

考虑以下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
;

现在考虑相应的执行计划:

enter image description here

现在请密切注意红色框上的红色!过滤谓词(CH.ID_STATUSCHAMADO=1)。它不在查询中,它是最昂贵的操作。

SERVICO的行少于200行,表STATUSCHAMADO的行少于10行,而表CHAMADO的行却超过70000行。

我的意图是仅在STATUSCHAMADO和SERVICO上进行全表扫描的那些联接,这对Oracle造成了轻微的开销。

我的陈述有什么问题?

更新1

我有以下索引:

  1. CHAMADO.ID_CHAMADO(PK)
  2. CHAMADO.ID_SERVICO
  3. CHAMADO.ID_AREAATENDIMENTO
  4. SERVICO.ID_SERVICO(PK)
  5. AREAATENDIMENTO.ID_AREAATENDIMENTO(PK)

1 个答案:

答案 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)。祝你好运。