簡體   English   中英

利用IN性能改善刪除

[英]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 );

在進行性能調整之前,您需要弄清楚為什么它沒有刪除正確的行。

因此,首先要進行選擇,直到找到正確的行。 請在每次檢查結果時建立一些選擇,以查看是否獲得所需的結果。

選擇之后,即可轉換為刪除。 測試刪除時,它是一個事務,並對遺留的數據進行一些測試,以確保在回滾或提交之前正確刪除了該數據。 由於您可能想對性能進行調整,因此建議您回退,以便隨后可以再次嘗試對性能進行調整的版本,以確保獲得相同的結果。 當然,您只想在開發服務器上執行此操作!

現在,盡管我同意不存在可能會更快,但是您要查看的其他一些內容是:

  • 您是否正在發生級聯刪除? 如果最終刪除許多子記錄,則可能是問題的一部分。
  • 是否有影響刪除的觸發器? 尤其要看是否有人設置了一行一行地而不是一組地運行。 當您刪除許多記錄時,逐行觸發器是一件非常糟糕的事情。 例如,假設您要刪除5萬條記錄,並且對審計表有刪除觸發器。 如果一次向該表插入一條記錄,則該記錄將被執行50K次。 如果它一步插入所有已刪除的記錄,則單獨插入可能會花費更長的時間,但總執行時間要短得多。
  • 您有什么索引,它對刪除有幫助嗎?
  • 您將要檢查每個查詢的解釋計划,以查看它們是否在改進查詢執行方式的詳細信息。

性能調優是一件復雜的事情,最好閱讀特定數據庫可用的一些性能調優書來詳細閱讀它。

我可能傾向於將查詢寫為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM