Sql 删除其他表中不存在的记录

Sql 删除其他表中不存在的记录,sql,sql-server,performance,sql-delete,Sql,Sql Server,Performance,Sql Delete,我有两个表:表1(ID,表2id,Col1,…)和表2(ID,Col1,…)。表2id是表2中的外键引用。我想编写一个查询,从表2中删除表1中不存在ID(Table2ID)的记录。表1中的记录计数大于3亿,表1中的记录计数大于1亿。我有两个疑问,但不确定哪一个更快: DELETE B FROM table1 a LEFT OUTER JOIN table2 b ON a.table2id = b.id WHERE b.id IS null 查询1(不起作用): 问题2: delete fro

我有两个表:表1(ID,表2id,Col1,…)和表2(ID,Col1,…)。表2id是表2中的外键引用。我想编写一个查询,从表2中删除表1中不存在ID(Table2ID)的记录。表1中的记录计数大于3亿,表1中的记录计数大于1亿。我有两个疑问,但不确定哪一个更快:

DELETE B
FROM table1 a
LEFT OUTER JOIN table2 b ON a.table2id = b.id 
WHERE b.id IS null
查询1(不起作用):

问题2:

delete from Table2
where ID not in (select distinct Table2ID from Table1)
Query2更快

delete from Table2
where ID not in (select distinct Table2ID from Table1)
这将更快:

DELETE B
FROM table1 a
LEFT OUTER JOIN table2 b ON a.table2id = b.id 
WHERE b.id IS null
试试这个

select * 
into #temptable2
from table2 t2,table1 t1 
where t1.table2id = t2.id;

truncate table table2;

insert into table2
select * from #temptable2;    

你能解释一下那里的情况吗?b、 ID在表2中始终有值,如果在表1中找不到b.ID,则不会有值。将“deleteb”更改为“select*”,您将看到返回的内容是的,我一直都是这样做的,只是使用左连接来获得那些不重叠的项目的结果