[英]Improve delete with IN performance
我很難在MariaDB 5.5.44數據庫中編寫DELETE查詢。
以下兩個代碼示例中的第一個效果很好,但是我需要在其中添加WHERE語句。 這將顯示在第二個代碼示例中。
我只需要從polozkyTransakci中刪除transakce_tmp表中的puvodFaktury <> FAKTURA VO CZ的行 。 我以為第二個示例中的WHERE語句可以與內部SELECT一起使用,但是它需要花很長時間才能處理(在基於雲的ETL工具中大約需要40分鍾),即使這樣,它也不會留下我想要的行。
1。
DELETE FROM polozkyTransakci
WHERE typPolozky = 'odpocetZalohy';
2。
DELETE FROM polozkyTransakci
WHERE typPolozky = 'odpocetZalohy'
AND idTransakce NOT IN (
SELECT idTransakce
FROM transakce_tmp
WHERE puvodFaktury = 'FAKTURA VO CZ');
向任何人致謝一百萬
大衛
IN對性能非常不利。嘗試使用NOT EXISTS()
DELETE FROM polozkyTransakci
WHERE typPolozky = 'odpocetZalohy'
AND NOT EXISTS (SELECT 1
FROM transakce_tmp r
WHERE r.puvodFaktury = 'FAKTURA VO CZ'
AND r.idTransakce = polozkyTransakci.idTransakce );
在進行性能調整之前,您需要弄清楚為什么它沒有刪除正確的行。
因此,首先要進行選擇,直到找到正確的行。 請在每次檢查結果時建立一些選擇,以查看是否獲得所需的結果。
選擇之后,即可轉換為刪除。 測試刪除時,它是一個事務,並對遺留的數據進行一些測試,以確保在回滾或提交之前正確刪除了該數據。 由於您可能想對性能進行調整,因此建議您回退,以便隨后可以再次嘗試對性能進行調整的版本,以確保獲得相同的結果。 當然,您只想在開發服務器上執行此操作!
現在,盡管我同意不存在可能會更快,但是您要查看的其他一些內容是:
性能調優是一件復雜的事情,最好閱讀特定數據庫可用的一些性能調優書來詳細閱讀它。
我可能傾向於將查詢寫為LEFT JOIN
,盡管我猜測這將具有與NOT EXISTS
相同的性能計划:
DELETE pt
FROM polozkyTransakci pt LEFT JOIN
transakce_tmp tt
ON pt.idTransakce = tt.idTransakce AND
tt.puvodFaktury = 'FAKTURA VO CZ'
WHERE pt.typPolozky = 'odpocetZalohy' AND tt.idTransakce IS NULL;
如果沒有索引,我會推薦索引: polozkyTransakci(typPolozky, idTransakce)
和transakce_tmp(idTransakce, puvodFaktury)
。 這些也可以在NOT EXISTS
版本上使用。
您可以使用SELECT
測試這些查詢的性能:
SELECT pt.*
FROM polozkyTransakci pt LEFT JOIN
transakce_tmp tt
ON pt.idTransakce = tt.idTransakce AND
tt.puvodFaktury = 'FAKTURA VO CZ'
WHERE pt.typPolozky = 'odpocetZalohy' AND tt.idTransakce IS NULL;
DELETE
應該更慢(由於記錄事務的成本),但是性能應該是可比的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.