2015-04-07 72 views
0

林做这个简单的交易:火鸟删除很慢

DELETE FROM ominve01 
WHERE CVE_OBS IN (SELECT CVE_OBS 
        FROM minve01 M 
        WHERE M.FECHA_DOCU < '31.12.2010' 
        OR FECHA_DOCU > '31.12.2015') 
  • minve01具有189K行
  • ominve01有86K行

但是这需要约2个半小时即可完成删除。我的查询不好?我该如何改进它?

或者我该如何提高交易速度?

  • ominve01.cve_obs是PK
  • minve01.cve_obs不pk的
+1

多久'SELECT'需要运行它自己的?如果这部分需要很长时间,请考虑'minve01.FECHA_DOCU'上的索引(我建议使用聚簇索引,但似乎Firebird不支持它们)。我认为'ominve01.CVE_OBS'上的索引不会有多大帮助 - 但无论如何你都可以试试看。我能想到的另一件事是完全重构语句,所以它不使用'WHERE column IN(subselect)',但我对Firebird的语法不足以提供任何建议。 – Turophile

+0

你指出我正确的方向...我添加了一个索引minve01.cve_obs和删除只需要980mS ...谢谢! – Chico3001

+1

您可能还想考虑使用'EXISTS'而不是'IN';它通常表现更好 –

回答

1
DELETE FROM ominve01 N 
WHERE 
exists(SELECT * FROM minve01 M 
     WHERE M.FECHA_DOCU < '31.12.2010' 
     OR FECHA_DOCU > '31.12.2015' and 
N.CVE_OBS=M.CVE_OBS) 

或执行块(你需要正确的变量的类型)

execute block 
as 
declare variable v integer; 
begin 
for SELECT M.CVE_OBS 
        FROM minve01 M 
        WHERE M.FECHA_DOCU < '31.12.2010' 
        OR FECHA_DOCU > '31.12.2015' 
into :v do delete from ominve01 WHERE CVE_OBS=:v; 
end 
+0

EXISTS解决方案也很慢。您是否试图使用存储过程删除rstrelba所说的内容? –