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
如果您有一些记录需要更新,这可能会提供更好的性能。虽然使用其他方法可能会获得更好的性能,但为此,我们至少需要看到一个执行计划
我可以建议,对于共享您使用的执行计划,包括索引在内的所有三个表的定义是什么?你得到了什么样的执行计划?接触和社交似乎有着非常相似的结构。您是否有可能在这里进行了属性拆分,并且它应该是一个带有附加列的表,其中包含该行的联系人/社交关系?