Sql server 在sql查询中实现按位OR而不是多In子句

Sql server 在sql查询中实现按位OR而不是多In子句,sql-server,tsql,Sql Server,Tsql,我有一个查询,它在子句中使用(也可以使用EXISTS来查询使用或子句在WHERE子句中过滤的多列。是否有更好的方法编写此查询 SELECT columndata FROM TABLE1 WHERE column1key in (select columnkey from #temptable1) OR column2key in (select columnkey from #temptable2) OR column3key IN (SELECT columnkey FROM #temptab

我有一个查询,它在
子句中使用
(也可以使用
EXISTS
来查询使用
子句在
WHERE
子句中过滤的多列。是否有更好的方法编写此查询

SELECT columndata FROM TABLE1
WHERE column1key in (select columnkey from #temptable1)
OR column2key in (select columnkey from #temptable2)
OR column3key IN (SELECT columnkey FROM #temptable3)

如下图所示,您可以选择“左连接”

    SELECT columndata 
    FROM TABLE1 tab1
    LEFT JOIN #temptable1  t1 on tab1.column1key =  t1.columnkey
    LEFT JOIN #temptable2  t2 on tab1.column2key =  t2.columnkey
    LEFT JOIN #temptable3  t3 on tab1.column3key =  t3.columnkey  

通过此操作,您可能会获得更好的性能,这会在以后使用重复数据消除将SELECT分解为单独的查询

SELECT columndata FROM TABLE1
WHERE column1key in (select columnkey from #temptable1)
UNION
SELECT columndata FROM TABLE1
WHERE column2key in (select columnkey from #temptable2)
UNION
SELECT columndata FROM TABLE1
WHERE column3key IN (SELECT columnkey FROM #temptable3)
但你真的得试试

如果没有索引或索引不正确,则仍然需要扫描相同数量的数据。有了好的索引,这可能会更好


作为旁注,EXISTS和IN将在此处给出相同的计划

,但请注意,如果临时表中有多个匹配项,则这可能会增加a)的结果列数,如果临时表不相关,则b)如果临时表之间不相关,并且我们在它们之间有效地生成笛卡尔连接。此外,您还必须添加
WHERE
子句<代码>其中t1.columnkey不为NULL或…
。诱惑项将始终具有唯一的记录。但我这里的疑问是,为什么左联会比在子句中表现更好。我无法理解这部分是这样的场景。请你给这个@sahial放点灯好吗?表1有3000000多行。因此,性能是这个场景查询中的主要因素,在哪里,子句影响表现你认为什么是“更好的方法”?性能更高(如果是这样,下一个问题是:您是否有性能问题)?更易于维护?更容易阅读?如果您编写了生成正确结果集的clear SQL,通常不会通过更改其文本对其进行调优(因为任何逻辑等效的查询都应该生成大致相同的执行计划)。您可以通过分析执行计划并识别缺少的索引来优化它。表中有3000000多行。所以我在想我是否可以按位或在这个场景中激活。上面的查询是动态sql的一部分。执行查询大约需要3~15秒。因此,我想调整此组件以获得更快的结果。@MayurPatil我将首先查看索引。或者仍然是或者;无论是否按位。例如,在#tentablex中的columnkey上是否有合适的索引?否该表在这些列上没有索引。表共有49列,其中30个表是筛选数据的候选列。聚集索引位于primarykey上,并且在date列上有一个索引要使用date进行筛选。如果使用某些筛选器组合可以提高性能,将尝试此操作