我有一個SQL Server 2005數據庫,並且我嘗試在相應的字段上放置索引以加速包含數百萬行的表的記錄的DELETE
(big_table
只有3列) ,但是現在的執行時間是DELETE
,甚至是更長的! (例如1小時對比13分鐘)SQL Server DELETE與索引速度較慢
我與表格之間有關係,並且我篩選我的DELETE
by的列在另一個表中。例如
DELETE FROM big_table
WHERE big_table.id_product IN (
SELECT small_table.id_product FROM small_table
WHERE small_table.id_category = 1)
順便說一句,我也試着:
DELETE FROM big_table
WHERE EXISTS
(SELECT 1 FROM small_table
WHERE small_table.id_product = big_table.id_product
AND small_table.id_category = 1)
,雖然它似乎略快於第一次運行,它仍然是慢了很多,有比沒有索引。
我創建了這些領域的指標:
big_table.id_product
small_table.id_product
small_table.id_category
我.LDF文件DELETE
期間增長了很多。
爲什麼我的表DELETE
查詢速度比較慢?我以爲他們應該跑得更快。
UPDATE
好了,共識似乎是監守索引必須更新索引會減慢巨大DELETE
。儘管如此,我仍然不明白爲什麼它不能同時排列所有行,只是在最後更新一次索引。
我的印象是,我的一些閱讀中指出,通過更快地搜索WHERE
子句中的字段,索引將加速DELETE
。
「在他們的SELECT語句做DELETE和UPDATE命令的記錄搜索索引時只是正常工作。」
但後來在文章中,它說太多索引可能會損害性能。
答案鮑勃問題:在表
- 5500萬行
- 被刪除42000000行
- 類似
SELECT
聲明不會跑型(異常「系統。OutOfMemoryException異常」被拋出)
我嘗試了以下2個查詢:
SELECT * FROM big_table
WHERE big_table.id_product IN (
SELECT small_table.id_product FROM small_table
WHERE small_table.id_category = 1)
SELECT * FROM big_table
INNER JOIN small_table
ON small_table.id_product = big_table.id_product
WHERE small_table.id_category = 1
兩個從SQL Server 2005中此錯誤消息25分鐘運行失敗後:
An error occurred while executing batch. Error message is: Exception of type 'System.OutOfMemoryException' was thrown.
數據庫服務器是具有7.5 GB RAM的較早的雙核Xeon機器。這是我的玩具測試數據庫:)所以它沒有運行其他任何東西。
我是否需要對我的索引做一些特殊處理後,我CREATE
他們使他們正常工作?
多少行是在表中?有多少行被刪除?一個類似的SELECT語句需要多長時間才能完成?瞭解SELECT語句的速度可能會提供一些關於索引如何影響DELETE的信息。 – bobs 2010-08-10 22:10:53
55 mil mil rows,42 deleted,not complete,see above for more details – JohnB 2010-08-12 01:31:13
這需要更長的時間,因爲當您執行刪除時,引用您的表的索引也必須更新。 – WOPR 2010-08-10 22:17:05