dwj*_*wjv 5 sql-server delete optimization sql-server-2012
使用 SQL Server 2012 Standard - 我正在根据另一个表的内容对一个表进行删除。这花费了相当长的时间(5 小时)并且对我来说似乎不是最佳选择,希望能提供一些优化语句的输入:
delete from [dbo].[tbl1]
where exists (
select *
from [dbo].[tbl2] t
where [dbo].[tbl1].[col1] = t.[col1]
and [dbo].[tbl1].[col2] = t.[col2]
and [dbo].[tbl1].[col3] = t.[col3]
)
Run Code Online (Sandbox Code Playgroud)
各列如下:
tbl1.col1 varchar(10)
tbl1.col2 datetime
tbl1.col3 varchar(60)
tbl2.col1 varchar(10)
tbl2.col2 datetime
tbl2.col3 varchar(30)
Run Code Online (Sandbox Code Playgroud)
我意识到数据类型 col3
不同,我知道这很糟糕,但这是否意味着无法使用索引?
每个表上都有一个非唯一聚集索引(此查询未涵盖)和两个表上的非聚集索引,涵盖 where 子句中包含的所有三列。
tbl1
包含约 12 亿行,tbl2
包含约 3000 万行。我预计将从中删除大约 3000 万行tbl1
。
任何帮助表示赞赏!
编辑:仅供参考,tbl1
并且tbl2
位于不同的文件组上,但位于同一个磁盘 (SAN) 上。另外,这里是执行计划:
看起来删除本身就是花费时间的。
您应该测试禁用、删除,然后重建索引。
我知道您说过您尝试过加入,但这将是一个快速测试
ALTER INDEX ALL ON [dbo].[tbl1] DISABLE;
delete top (1000) tbl1Del
from [dbo].[tbl1] and tbl1Del
join [dbo].[tbl2] t
on tbl1Del.[col1] = t.[col1]
and tbl1Del.[col2] = t.[col2]
and tbl1Del.[col3] = t.[col3];
ALTER INDEX ALL ON [dbo].[tbl1] REBUILD;
Run Code Online (Sandbox Code Playgroud)
运行此选择,您将知道确定要删除的行是否是问题所在。
select count(*)
from [dbo].[tbl1] and tbl1Del
join [dbo].[tbl2] t
on tbl1Del.[col1] = t.[col1]
and tbl1Del.[col2] = t.[col2]
and tbl1Del.[col3] = t.[col3]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
137 次 |
最近记录: |