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)
虽然它似乎比第一个运行得稍微快一点,但索引的速度仍然比没有速度慢得多.
我在这些字段上创建了索引:
big_table.id_productsmall_table.id_productsmall_table.id_category我的.ldf文件在这期间增长了很多DELETE.
DELETE当我的表上有索引时,为什么我的查询会变慢? 我以为他们应该跑得更快.
UPDATE
好的,共识似乎是索引将放慢一个巨大的DELETE因为索引必须更新.虽然,我仍然不明白为什么它不能同时DELETE全部所有行,并且最后只更新一次索引.
我从一些阅读中得到的印象是,DELETE通过WHERE更快地搜索子句中的字段,索引会加快.
"在DELETE和UPDATE命令中搜索记录时,索引的工作方式与SELECT语句一样."
但是在文章的后面,它说太多的索引会影响性能.
鲍勃问题的答案:
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)速度较慢,因为它们涉及操作索引.考虑本书后面的相同索引.如果添加,删除或更改页面,还有更多工作要做,因为您还必须更新索引.
| 归档时间: |
|
| 查看次数: |
17675 次 |
| 最近记录: |