我有一个包含 EntityID 列的大约 200,000 条记录的列表,我将其加载到临时表变量中。
如果 Temp 表中的 EntityID 在 dbo.EntityRows 表中不存在,我想插入 Temp 表变量中的任何记录。dbo.EntityRows 表包含大约 800,000 条记录。
与 dbo.EntityRows 表有大约 500,000 条记录时相比,该过程非常缓慢。
我的第一个猜测是因为 NOT EXISTS 子句,Temp 变量中的每一行都必须扫描 dbo.EntityRows 表的整个 800k 行以确定它是否存在。
问题:是否有其他方法可以在不使用 NOT EXISTS 的情况下运行此比较检查,这会产生巨大的成本并且随着 dbo.EntityRows 继续增长只会变得更糟?
编辑:欣赏评论。这是查询(我在 IF NOT EXISTS 检查之后省略了部分。之后,如果 NOT EXISTS,我插入到 4 个表中)。
declare @EntityCount int, @Counter int, @ExistsCounter int, @AddedCounter int
declare @LogID int
declare @YdataInsertedEntityID int, @YdataSearchParametersID int
declare @CurrentEntityID int
declare @CurrentName nvarchar(80)
declare @CurrentSearchParametersID int, @CurrentSearchParametersIDAlreadyDone int
declare @Entities table
(
Id int identity,
EntityID int,
NameID nvarchar(80),
SearchParametersID int
)
insert into @Entities
select EntityID, NameID, SearchParametersID from YdataArvixe.dbo.Entity order by entityid;
set @EntityCount = (select count(*) from @Entities);
set @Counter = 1;
set @LogID = null;
set @ExistsCounter = 0;
set @AddedCounter = 0;
set @CurrentSearchParametersIDAlreadyDone = -1;
While (@EntityCount >= @Counter)
begin
set @CurrentEntityID = (select EntityID from @Entities
where id = @Counter)
set @CurrentName = (select nameid from @Entities
where id = @Counter);
set @CurrentSearchParametersID = (select SearchParametersID from @Entities
where id = @Counter)
if not exists (select 1 from ydata.dbo.entity
where NameID = @CurrentName)
begin
-- I insert into 4 tables IF NOT EXISTS = true
end