tsql – UNION ALL可以比JOIN更快还是我的JOIN只是吮吸?

我有一个带有uniqueidentifier列的Notes表,我将其用作数据库中各种其他表的FK(不用担心,其他表上的uniqueidentifier列不是群集PK).这些其他表表示业务对象的层次结构.作为一个简单的表示,假设我还有另外两个表:

>潜在客户(PK LeadID)
>行情(PK QuoteID,FK LeadID)

在应用程序中显示Lead时,我需要显示与潜在客户相关的所有注释,包括标记为属于该潜在客户的任何Quote的那些注释.据我所知,我有两个选项 – UNION ALL或几个LEFT JOIN语句.这是他们看起来的样子:

SELECT N.*  
FROM Notes N  
JOIN Leads L ON N.TargetUniqueID = L.UniqueID  
WHERE L.LeadID = @LeadID

UNION ALL

SELECT N.*  
FROM Notes N  
JOIN Quotes Q ON N.TargetUniqueID = Q.UniqueID  
WHERE Q.LeadID = @LeadID

要么…

SELECT N.*  
FROM Notes N  
LEFT JOIN Leads L ON N.TargetUniqueID = L.UniqueID  
LEFT JOIN Quotes Q ON N.TargetUniqueID = Q.UniqueID  
WHERE L.LeadID = @LeadID OR Q.LeadID = @LeadID

在现实生活中,我总共有五个表可以附加注释,并且随着应用程序的增长,这个数字会增长.我已经在我正在使用的uniqueidentifier列上设置了非聚集索引,而sql Profiler说我无法进行任何进一步的改进,但是当我对一个真实大小的测试数据集进行性能测试时,我得到了以下号码:

> UNION ALL – 0.010秒
> LEFT JOIN – 0.744秒

我一直听说使用UNION很糟糕,并且UNION ALL只是稍微好一些,但性能数字似乎并不能证明这一点.当然,UNION ALL sql代码可能更难以维护,但在这性能差异下,它可能是值得的.

那么UNION ALL在这里真的更好吗,还是我在LEFT JOIN代码上遗漏了一些东西,这会让事情变慢?

解决方法

UNION ALL版本可能很容易通过2次索引搜索得到满足.或者可以导致扫描.执行计划是什么样的?

您是否尝试过此操作以避免两次访问Notes?

;WITH J AS
(
SELECT UniqueID FROM Leads WHERE LeadID = @LeadID
UNION ALL
SELECT UniqueID FROM Quotes WHERE LeadID = @LeadID
)

SELECT N.*  /*Don't use * though!*/
FROM Notes N  
JOIN J ON N.TargetUniqueID = J.UniqueID

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...