有没有更快的方法将记录与另一个表的列中的值匹配?

时间:2019-03-08 05:53:48

标签: sql sql-server

我需要获取另一个表的列中不存在的值。目前我正在使用的是

and [tPlayerTag].TagId NOT IN (select RequiredTagId from dbo.tPrize(NOLOCK) 
where RequiredTagId is not null)

这存在于我的where子句中。 它的工作完全正常,但我认为当处理较大的表(tPrize)时,它可能会减慢查询速度。有没有更快的方法可以重写此逻辑?

3 个答案:

答案 0 :(得分:1)

您可以使用not exists

当然,要一个接一个地选择取决于一种情况:驱动查询和驱动查询返回的数据量。对于[NOT] IN operator,内部查询(..where中的ID(从表中选择ID))是驱动查询,而对于[NOT] EXISTS,外部查询是驱动查询。因此,如果子查询(内部查询)返回少量数据是由于子查询中的表包含少量行或者对子查询应用了密集过滤[NOT] IN运算符可能会提供更好的性能。如果子查询返回大量数据,或者在外部查询中进行了主要过滤,则[NOT] EXISTS operator是首选。

and [tPlayerTag].TagId NOT exists (select RequiredTagId from dbo.tPrize(NOLOCK) 
where RequiredTagId is not null)

答案 1 :(得分:1)

您可以使用in代替exists,也可以not in代替not exists 并尝试这样,它将起作用。

在性能方面,您必须使用not exists

[tPlayerTag].TagId NOT exists (select RequiredTagId from dbo.tPrize(NOLOCK) 
where RequiredTagId is not null)

答案 2 :(得分:1)

我强烈建议您使用not exists而不是not in,因为NULL的值不会影响结果。由于您的where子句,您似乎知道这是一个问题。

表达式是:

NOT EXISTS (SELECT 1
            FROM dbo.tPrize p
            WHERE p.RequiredTagId = tPlayerTag.TagId
           )

为了提高性能,您希望在tPrize(RequiredTagId)上建立索引。该指数将使性能更具可扩展性。