我有一个 SQL Server 2005 数据库,我尝试在适当的字段上放置索引,以加快DELETE
数百万行(big_table
只有 3 列)表中记录的速度,但现在DELETE
执行时间更长!(例如 1 小时对 13 分钟)
我在表之间有关系,我过滤的列DELETE
在另一个表中。例如
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
当我的表上有索引时,为什么我的查询会变慢? 我以为他们应该跑得更快。
更新
好的,共识似乎是索引将大大减慢,DELETE
因为必须更新索引。虽然,我仍然不明白为什么它不能DELETE
一次所有的行,而只是在最后更新一次索引。
我从我的一些阅读中得到的印象是,DELETE
通过更快地搜索WHERE
子句中的字段,索引会加快速度。
“在 DELETE 和 UPDATE 命令中搜索记录时,索引的工作方式与在 SELECT 语句中一样。”
但在文章后面,它说过多的索引会损害性能。
鲍勃问题的答案:
- 表中有 5500 万行
- 4200 万行被删除
- 类似
SELECT
的语句不会运行(抛出了“System.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
运行25 分钟后两者均失败,并出现来自 SQL Server 2005 的以下错误消息:
An error occurred while executing batch. Error message is: Exception of type 'System.OutOfMemoryException' was thrown.
数据库服务器是具有 7.5 GB 内存的较旧的双核 Xeon 机器。这是我的玩具测试数据库:) 所以它没有运行其他任何东西。
我需要对我的索引做一些特殊的事情CREATE
以使它们正常工作吗?