gpt4 book ai didi

sql - 加入 OR 的性能

转载 作者:行者123 更新时间:2023-12-04 13:57:57 27 4
gpt4 key购买 nike

假设我有两个表:

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/

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