2012-02-02 74 views
1

我運行一個存儲過程從兩個表中刪除數據:加快具有刪除加入

delete from TESTING_testresults 
from TESTING_testresults 
inner join TESTING_QuickLabDump 
on TESTING_QuickLabDump.quicklabdumpid = TESTING_TestResults.quicklabdumpid 
where TESTING_quicklabdump.[Specimen ID][email protected] 



delete from TESTING_QuickLabDump 
from TESTING_Quicklabdump 
where [specimen id][email protected] 

一個表爲60μm行,另一種是2m左右行

過程大約需要3運行幾秒鐘。

有沒有什麼辦法可以加快速度?也許使用EXISTS

意味着IF EXISTS...THEN DELETE - 因爲刪除不應該發生的每一次

像這樣

如果@specimen existsTESTING_QuickLabDump然後執行程序與兩個刪除

謝謝!

+0

是否確定,如果它是查詢(找到要刪除的行),或花費最多時間的實際行刪除? – Magnus 2012-02-02 22:45:04

+0

如果建立索引或其他調整工作無效,並且這構成了一個實際問題,您可能需要查看錶分區,這將允許您在沒有開銷的情況下執行刪除操作。 – 2012-02-03 00:10:50

+1

也許我正在閱讀這裏的內容,但是您是否試圖逐行刪除數據?如果是這樣,請嘗試一種基於集合的方法。也就是說,創建一個臨時表,保存所有SpeciminID以刪除並加入它。 – 2012-02-03 01:07:48

回答

1

對於具有60點密耳的行我肯定會考慮水平和/或垂直劃分的數據的表。如果它是時間敏感數據,那麼您應該能夠將舊數據移動到歷史記錄表中。這通常是人們做的第一件也是最明顯的事情,我想如果那是你有可能做到的。

如果有很多列那就肯定有利於你的數據非規範化成多個表。如果你這樣做了,我會建議重命名這些表並創建一個以原始表命名的所有分區表的視圖。這樣做應該確保現有代碼不被破壞。

如果你「真的」要微調的速度,那麼你應該考慮得到一個更快的硬盤和了解一點硬盤的工作方式。例如,數據是否存儲在HD的內部或外部將會影響訪問速度。而固態硬盤已經走了很長的路,所以你可能會考慮獲取其中的一個。

+0

,這應該會更方便一些關於「硬盤如何」工作的信息。 – 2012-02-04 00:20:34

2

重寫查詢可能無法幫助加快速度。使用profiler找出查詢的哪些部分很慢。爲此,使分析器輸出execution plan。然後,嘗試添加適當的索引。也許一個或兩個表可以使用索引[specimen id]

+0

同時在quicklabdumpid – usr 2012-02-03 00:19:59

+0

上添加索引非常感謝。你能告訴我user23498293874 profiler顯示映射(或涉及)哪些索引應該被添加?我明白你在說什麼,但我不知道如何實現它 – 2012-02-03 17:47:25

+0

使分析器輸出爲[執行計劃](http://www.sql-server-performance.com/2006/query-execution-plan-analysis/ )。我還記得聽說過一個工具,它會根據您執行的查詢自動建議索引。 – krlmlr 2012-02-03 23:32:03

1

除了索引「顯而易見」的字段外,還要查看數據庫模式,並檢查是否有任何FOREIGN KEY的ON DELETE CASCADE或SET NULL可能由您的刪除觸發(與Oracle不同,MS SQL Server將傾向於顯示這些在執行計劃中)。幸運的是,通過對FOREIGN KEY的子端點進行索引,這通常很容易解決。

同時檢查是否有任何昂貴的觸發器。