我有一个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