2015-04-07 71 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所說的內容? –