Sql 选择条件较慢的位置

Sql 选择条件较慢的位置,sql,sql-server,tsql,Sql,Sql Server,Tsql,在我看来,select语句(本身速度非常快)比将条件显式地写为字符串要慢。下面是一个虚拟示例: 快速版本: select * FROM db.dbo.A left join db.dbo.B on A.id = B.id where A.selected_variable in ('XXX','YYY') 慢版本: select selected_variable into #t_temp from db.dbo.some_table where some_condition

在我看来,select语句(本身速度非常快)比将条件显式地写为字符串要慢。下面是一个虚拟示例:

快速版本:

select *
FROM db.dbo.A
left join db.dbo.B on A.id = B.id
where A.selected_variable in ('XXX','YYY')
慢版本:

select 
    selected_variable
    into #t_temp
from db.dbo.some_table
where some_condition = 'X'

select *
FROM db.dbo.A
left join db.dbo.B on A.id = B.id
where A.selected_variable in (select selected_variable from #t_temp) -- returns ('XXX','YYY')

有人知道为什么以及什么是避免性能下降的最佳实践吗?

您可以尝试以下版本,它可以避免额外的TempDB IO(这会降低性能)

此外,请查看所选的\u变量、某些\u表中的某些\u条件是否具有正确的索引

SELECT A.*
FROM dbo.A AS A
INNER JOIN DBO.some_table AS s 
ON A.Selected_Variable = s.selected_variable
LEFT JOIN dbo.B AS B ON A.id = B.id
WHERE s.some_condition = 'X'

您可以尝试以下版本,这样可以避免额外的TempDB IO(这会降低性能)

此外,请查看所选的\u变量、某些\u表中的某些\u条件是否具有正确的索引

SELECT A.*
FROM dbo.A AS A
INNER JOIN DBO.some_table AS s 
ON A.Selected_Variable = s.selected_variable
LEFT JOIN dbo.B AS B ON A.id = B.id
WHERE s.some_condition = 'X'

我认为性能透视图
EXISTS
优于
IN
子句中的
。因为
子句中的
在内部转换为
条件(导致更多条件)

尝试此脚本并比较查询执行计划和执行时间

select *
FROM db.dbo.A
left join db.dbo.B on A.id = B.id
where EXISTS (select 1 
              from db.dbo.some_table t 
              WHERE A.selected_variable = t.selected_variable AND some_condition = 'X') 

我认为性能透视图
EXISTS
优于
IN
子句中的
。因为
子句中的
在内部转换为
条件(导致更多条件)

尝试此脚本并比较查询执行计划和执行时间

select *
FROM db.dbo.A
left join db.dbo.B on A.id = B.id
where EXISTS (select 1 
              from db.dbo.some_table t 
              WHERE A.selected_variable = t.selected_variable AND some_condition = 'X') 

这取决于索引。您可能想指出什么是正确的索引。这取决于索引。您可能想指出什么是正确的索引。