gpt4 book ai didi

sql-server - SQL 运算符 IN 与 INNER JOIN

转载 作者:行者123 更新时间:2023-12-01 06:17:47 25 4
gpt4 key购买 nike

使用 SQL Server 2014:

以下语句之间是否存在性能差异?

DELETE FROM MyTable where PKID IN (SELECT PKID FROM @TmpTableVar)

DELETE FROM MyTable INNER JOIN @TmpTableVar t ON MyTable.PKID = t.PKID

最佳答案

在您给出的示例中,执行计划将是相同的(很可能)。

但是具有相同的执行计划并不意味着它们是您对该语句可能拥有的最佳执行计划。

我在您的两个查询中看到的问题是 Table Variable 的使用。

SQL Server 始终假定表变量中只有 1 行。仅在 SQL Server 2014 及更高版本中,此假设已更改为 100 行。

因此,无论您有多少行,表变量 SQL Server 始终假定您在 @TmpTableVar 中只有一行。

您可以稍微更改您的代码,让 SQL Server 更好地了解该表中将有多少行,方法是将其替换为 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)

注意

In 运算符可以正常工作,因为它是表变量中的主键列。但是如果您曾经在可为空的列上使用 IN 运算符,结果可能会让您感到惊讶,IN 运算符一旦在它正在检查的列中找到 NULL 值,就会变成梨形。

对于此类查询,我个人更喜欢 Exists 运算符,但内部联接也应该可以正常工作,但如果可以,请避免使用 IN 运算符。

关于sql-server - SQL 运算符 IN 与 INNER JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38591950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com