SQL Server DELETE的索引速度较慢

Joh*_*hnB 6 sql sql-server subquery sql-delete

我有一个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)
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我也尝试过:

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)
Run Code Online (Sandbox Code Playgroud)

虽然它似乎比第一个运行得稍微快一点,但索引的速度仍然比没有速度慢得多.

我在这些字段上创建了索引:

  1. big_table.id_product
  2. small_table.id_product
  3. small_table.id_category

我的.ldf文件在这期间增长了很多DELETE.

DELETE当我的表上有索引时,为什么我的查询会变慢? 我以为他们应该跑得更快.

UPDATE

好的,共识似乎是索引将放慢一个巨大的DELETE因为索引必须更新.虽然,我仍然不明白为什么它不能同时DELETE全部所有行,并且最后只更新一次索引.

我从一些阅读中得到的印象是,DELETE通过WHERE更快地搜索子句中的字段,索引会加快.

Odetocode.com说:

"在DELETE和UPDATE命令中搜索记录时,索引的工作方式与SELECT语句一样."

但是在文章的后面,它说太多的索引会影响性能.

鲍勃问题的答案:

  1. 表中有5500万行
  2. 删除了4200万行
  3. 类似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
Run Code Online (Sandbox Code Playgroud)

使用SQL Server 2005中的此错误消息运行25分钟后,两者都失败了:

An error occurred while executing batch. Error message is: Exception of type 'System.OutOfMemoryException' was thrown.
Run Code Online (Sandbox Code Playgroud)

数据库服务器是一台较旧的双核Xeon机器,内存为7.5 GB.这是我的玩具测试数据库:)所以它没有运行任何其他东西.

在我使用CREATE它们使它们正常工作之后,我是否需要对我的索引做一些特别的事情?

bra*_*ter 27

索引使查找更快 - 就像书后面的索引一样.

更改数据的操作(如DELETE)速度较慢,因为它们涉及操作索引.考虑本书后面的相同索引.如果添加,删除或更改页面,还有更多工作要做,因为您还必须更新索引.