sql - 加入 OR 的性能

标签 sql sql-server performance tsql

假设我有两个表:

Table A
ProdID | PartNumber | Data...
1      | ABC-a      | "Data A"
2      | (null)     | "Data B"
3      | ABC-c      | "Data C"
...

Table B
ProdID | PartNumber | DataB
(null) | ABC-a      | "Data D"
2      | (null)     | "Data E"
3      | (null)     | "Data F"
(null) | ABC-z      | "Data G"
...

不理想,但无论如何。我要

ProdID | PartNumber | Data     | DataB...
1      | ABC-a      | "Data A" |  "Data D"
2      | (null)     | "Data B" |  "Data E"
3      | ABC-c      | "Data C" |  "Data F"
(null) | ABC-z      | (null)   |  "Data G"

所以我用

SELECT * 
FROM Table1 T1
     RIGHT JOIN Table2 T2 ON
          T1.ProdID = T2.ProdID OR T1.PartNumber = T2.PartNumber

这正是我想要的,但似乎需要大约 100 倍于 or 的任一侧。作为更复杂查询的一部分,OR 需要 2 分钟,而 int 需要 <1 秒,nvarchar(50) 需要 1 秒。表“A”有约 13k 行,表“b”有约 35k 行,整个查询返回约 40k。

查询计划 OR query int nvarchar

我认为这个“Table Spool”可能是问题所在。 enter image description here

SQL Server 2008 R2 Express。想法?

最佳答案

分别加入每种方式,然后合并结果:

SELECT T1.ProdID, T1.PartNumber, T1.Data, ISNULL(tprodid.DataB, tpartno.DataB) as DataB
FROM Table1 T1
LEFT JOIN Table2 tprodid ON T1.ProdID = tprodid.ProdID
LEFT JOIN Table2 tpartno ON T1.PartNumber = tpartno.PartNumber;

这将使用两个索引并且性能良好。您可能希望根据自己的喜好调整 ISNULL 逻辑。

关于sql - 加入 OR 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8305655/

相关文章:

c# - 如何解决 SQLite "no such table"错误?

sql - 如何使用 SQL PARTITION BY GROUPS?

sql-server - 在 SQL 中仅获取每天的多个条目中的最后一行

java - 如何在 Java 中查找 CPU 密集型类?

c# - 删除 UWP 中的导航缓存

c++ - 比较 Fortran 和 C++ 汇编程序的 int = floor(sqrt(...))

mysql - 在 CI 事件记录中加入 UPDATE/INSERT

sql - Spark : scala. MatchError(类 org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema

sql - 不同where条件句的聚合函数

java - Java 中的父类和子类应该有 2 个数据表吗?