不存在或不存在查询对于大数据Sybase来说非常慢

时间:2016-06-02 06:20:40

标签: sql sybase

我有一张表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是解决方案吗?

2 个答案:

答案 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;