我有一张表A,它有大约50000条记录,一张表B也有50000条记录。 样本数据:
A B
1 1
2 2
3 null
4 null
我想找到表A中存在但不在表B中的记录3,4。 我正在使用
select id from A where id NOT IN(select id from B)
我也尝试过不存在,但由于记录数量非常大,所以仍需要很长时间。
select id from A where NOT Exists(select id from B and B.id = A.id)
左外连接不能用于查找丢失的记录,因为表B中没有id。
有没有办法让Sybase本身的查询工作更快? 或者将数据库转移到MongoDB是解决方案吗?
答案 0 :(得分:2)
我不确定你为什么不准备LEFT JOIN,我尝试使用LEFT JOIN
它会返回你的预期结果。
使用给定数据执行示例:
DECLARE @TableA TABLE (Id INT);
DECLARE @TableB TABLE (Id INT);
INSERT INTO @TableA (Id) VALUES (1), (2), (3), (4);
INSERT INTO @TableB (Id) VALUES (1), (2), (NULL), (NULL);
SELECT T1.Id
FROM @TableA T1
LEFT JOIN @TableB T2 ON T2.Id = T1.Id
WHERE T2.Id IS NULL
结果
3
4
答案 1 :(得分:1)
在性能视角中,始终尽量避免使用NOT IN,NOT EXISTS等反向关键字。因为要检查DBMS需要运行所有可用记录的反向项,并删除反向选择。
LEFT JOIN / IS NULL和NOT EXISTS在语义上是等价的,而NOT IN则不是。这些方法在table_right中处理NULL值的方式不同。
因此,你应该选择LEFT JOIN来提高你的sql性能。
select A.id from A LEFT JOIN B
on A.id = B.id
where B.id is null
order by A.id;