使用多个表和查询优化进行更新

时间:2016-03-29 12:58:04

标签: oracle11g query-optimization

我有这个更新声明

  UPDATE
  pr
  SET
  pr.ult_prezzo_euro = ROUND(pr.ult_prezzo/fs.cambio,7)
  FROM --error SQL COMMAND NOT PROPERLY ENDED
  fin_prodotto prod INNER JOIN
  fin_prodotto_linea fpl ON prod.prodotto_id=fpl.prodotto_id INNER JOIN
  fin_att_fin faf ON fpl.attivita_fin_id=faf.attivita_fin_id INNER JOIN
  fin_prezzo pr ON pr.attivita_fin_id=faf.attivita_fin_id INNER JOIN
  flx_sec_posizione_dt_upd fs ON pr.attivita_fin_id=fs.attivita_fin_id
  where 
      prod.prodotto_id=43
  and faf.codice_titolo_cad_s is not null
  and pr.ult_prezzo = pr.ult_prezzo_euro
  and faf.divisa_quot_t<>'242'
  and prod.gstd_esist_b='S'
  and fpl.gstd_esist_b='S'
  and faf.gstd_esist_b='S'
  and pr.gstd_esist_b='S'
  and pr.gstd_ult_user_s in ('AGGIORNAMENTO_POSIZIONE')
  and pr.ult_prezzo>0
  and fs.cambio>0;

它给了我“SQL COMMAND NOT PROPERLY ENDED”指向FROM行,

我还会优化此更新语句,因为这应该在大约2百万条记录上运行,怎么可能?

1 个答案:

答案 0 :(得分:1)

我不能确定在没有看到您的数据库结构的情况下它是正确的答案,但首先: 你的语法错误,它应该是这样的:

UPDATE fin_prezzo as pr SET pr.ult_prezzo_euro = ...

然后你将不得不改变JOINS链,从fin_prezzo表中充分加入(作为第一个提到的表)。 如果它有问题,你可以'更新'语句中的另一个表(不更改/添加/删除更新的列)

广告优化部分: 最好先用SELECT语句(而不是UPDATE)来查看它是如何加入的(可能因为连接而重复行)并减少重复,或者不是必要的连接。 其次,将“规则”从WHERE语句移动到JOIN语句会更快 例如:

 INNER JOIN fin_att_fin as faf ON fpl.attivita_fin_id=faf.attivita_fin_id AND faf.gstd_esist_b='S'

另一个好方法是比较数字而不是字符串('S','242'......),它只是更快

休息是尝试..

希望我帮了一下;)