使用SQL Server 2014:
以下陈述之间是否存在任何性能差异?
DELETE FROM MyTable where PKID IN (SELECT PKID FROM @TmpTableVar)
Run Code Online (Sandbox Code Playgroud)
和
DELETE FROM MyTable INNER JOIN @TmpTableVar t ON MyTable.PKID = t.PKID
Run Code Online (Sandbox Code Playgroud)
在您给出的示例中,执行计划将是相同的(最可能).
但是,拥有相同的执行计划并不意味着它们是您可能拥有的最佳执行计划.
我在两个查询中看到的问题是使用Table Variable.
SQL Server始终假定表变量中只有1行.仅在SQL Server 2014及更高版本中,此假设已更改为100行.
所以无论你有多少行,表变量SQL Server总是假设你有一行@TmpTableVar.
您可以稍微更改代码,以便通过将其替换为a来更好地了解该表中将有多少行Temporary table,因为它是PK_ID表变量中的列,您还可以在该表上创建索引,以便给出最好的机会sql server为这个查询提出最好的执行计划.
SELECT PKID INTO #Temp
FROM @TmpTableVar
-- Create some index on the temp table here .....
DELETE FROM MyTable
WHERE EXISTS (SELECT 1
FROM #Temp t
WHERE MyTable.PKID = t.PKID)
Run Code Online (Sandbox Code Playgroud)
注意
在运算符中可以正常工作,因为它是表变量中的主键列.但是如果您在可空列上使用IN运算符,结果可能会让您感到惊讶,IN运算符会在它检查的列中找到NULL值时立即变为所有梨形状.
我个人更喜欢Exists运算符来进行此类查询,但内部联接也应该可以正常运行,但如果可以,请避免使用IN运算符.