【问题标题】:Update with multiple tables and query optimization多表更新和查询优化
【发布时间】:2016-03-29 12:58:04
【问题描述】:

我有这个更新声明

  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;

它给了我指向 FROM 行的“SQL 命令未正确结束”,

而且我会优化这个更新语句,因为这应该在大约 200 万条记录上运行,这怎么可能?

【问题讨论】:

    标签: oracle11g query-optimization


    【解决方案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'...),它只是更快

    休息取决于尝试..

    希望我能帮上一点忙;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-10
      • 2015-11-08
      • 2022-01-24
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      相关资源
      最近更新 更多