SQL Server。
我有一个proc,它采用用户定义的表(readonly),大约有7500条记录。使用该UDT,我运行了大约15种不同的删除语句:
delete from table1
where id in (select id from @table)
delete from table2
where id in (select id from @table)
delete from table3
where id in (select id from @table)
delete from table4
where id in (select id from @table)
....
正如预期的那样,此操作需要一段时间(约7-10分钟)。这些列已编制索引。但是,我怀疑有一种更有效的方法可以做到这一点。我知道删除传统上比较慢,但我并不期待这种缓慢。
有更好的方法吗?
答案 0 :(得分:1)
您可以测试/尝试“存在”而不是“IN”。除了随意查询查询之外,我真的不喜欢IN子句。 (有些人会争论IN,直到他们脸色发青)
Delete deleteAlias
from table1 deleteAlias
where exists ( select null from @table vart where vart.Id = deleteAlias.Id )
您可以填充#temp表而不是@variableTable。多年来,这一直是试验和测试。 @variable vs #temp,大部分时间都没有做出那么大的不同。但是在我遇到的大约4种情况下,去#temp表会产生很大的影响。 您还可以尝试在#temp表上添加索引(“加入”列,在此示例中为“Id”)
IF OBJECT_ID('tempdb..#Holder') IS NOT NULL
begin
drop table #Holder
end
CREATE TABLE #Holder
(ID INT )
/* simulate your insert */
INSERT INTO #HOLDER (ID)
select 1 union all select 2 union all select 3 union all select 4
/* CREATE CLUSTERED INDEX IDX_TempHolder_ID ON #Holder (ID) */
/* optional, create an index on the "join" column of the #temp table */
CREATE INDEX IDX_TempHolder_ID ON #Holder (ID)
Delete deleteAlias
from table1 deleteAlias
where exists ( select null from #Holder holder where holder.Id = deleteAlias.Id )
IF OBJECT_ID('tempdb..#Holder') IS NOT NULL
begin
drop table #Holder
end
恕我直言,没有明确的答案,有时你需要做一点实验。
“你的tempdb如何设置”是影响#temp表性能的一个巨大的分支。但首先尝试上面的建议。
最后一个实验
Delete deleteAlias
from table1 deleteAlias
where exists ( select 1 from @table vart where vart.Id = deleteAlias.Id )
将null更改为“1”....一旦我看到这会影响某些东西。很奇怪,对吧?