Sql 避免查找完整索引需要扫描不等于特定值的值

Sql 避免查找完整索引需要扫描不等于特定值的值,sql,sql-server,Sql,Sql Server,我想更新表用户并设置一些值。我目前的建议是: UPDATE Users SET Maried = 0, Sex = NULL WHERE ID IN (SELECT Facebook FROM Social WHERE Id = @param AND (CountryId = 16 OR CountryId = 20)) AND ID NOT IN (SELECT Facebook

我想更新表用户并设置一些值。我目前的建议是:

UPDATE Users 
SET Maried = 0, 
    Sex = NULL 
WHERE ID IN (SELECT Facebook 
             FROM Social 
             WHERE Id = @param 
               AND (CountryId = 16 OR CountryId = 20)) 
  AND ID NOT IN (SELECT Facebook 
                 FROM Contact 
                 WHERE Id <> @param 
                   AND (CountryId = 16 OR CountryId = 20))

如何避免完全扫描以将ID放入子查询?

您可以尝试将查询分成两部分并使用临时表,如下所示:

SELECT Facebook
INTO #temp
FROM
    (SELECT Facebook 
    FROM Social 
    WHERE Id = @param 
        AND (CountryId = 16 OR CountryId = 20)
    EXCEPT
    SELECT Facebook 
    FROM Contact 
    WHERE Id <> @param 
        AND (CountryId = 16 OR CountryId = 20) ) reslt

UPDATE u
SET Married = 0
    , Sex = NULL
FROM Users u
    INNER JOIN #temp t on u.ID = t.Facebook
如果您有一些记录需要更新,这可能会提供更好的性能。虽然使用其他方法可能会获得更好的性能,但为此,我们至少需要看到一个执行计划


我可以建议,对于共享您使用的执行计划,包括索引在内的所有三个表的定义是什么?你得到了什么样的执行计划?接触和社交似乎有着非常相似的结构。您是否有可能在这里进行了属性拆分,并且它应该是一个带有附加列的表,其中包含该行的联系人/社交关系?