使用union子查询连接的mssql选择非常慢

时间:2017-08-09 08:44:22

标签: sql-server select subquery left-join union

SELECT 
TOP 10 pcchrgcod
FROM ( 
SELECT TOP 10 acctno AS pcchrgcod FROM hdocord
WHERE acctno LIKE '2007-000%' 
GROUP BY 
acctno
UNION

SELECT TOP 10 acctno AS pcchrgcod FROM hpatchrg
WHERE acctno LIKE '2007-000%' 
GROUP BY 
acctno 
UNION

SELECT TOP 10 acctno AS pcchrgcod FROM hrqd
WHERE acctno LIKE '2007-000%' 
GROUP BY 
acctno
UNION

SELECT TOP 10 acctno AS pcchrgcod FROM hrxo
WHERE acctno LIKE '2007-000%'   
GROUP BY 
acctno 
)
sub 
GROUP BY 
pcchrgcod

这是我的选择,带有union和子查询等,这是返回ok结果,但它很慢。所以我把联盟变成了JOIN,我得到了这个

SELECT TOP 10  coalesce(t1.acctno, MAX(t2.acctno),MAX(t3.acctno),MAX(t4.acctno)) AS pcchrgcod 
--t1.acctno AS t1pcchrgcod,
--t2.acctno AS t2pcchrgcod,
--t3.acctno AS t3pcchrgcod,
--t4.acctno AS t4pcchrgcod
FROM hdocord    AS t1 LEFT JOIN 
hpatchrg AS t2 ON t1.acctno = t2.acctno LEFT JOIN 
hrqd AS t3 ON t2.acctno = t3.acctno LEFT JOIN 
hrxo AS t4 ON t3.acctno = t4.acctno 
WHERE t1.acctno LIKE '2007-000%'    
GROUP BY 
t1.acctno
--t2.acctno,
--t3.acctno,
--t4.acctno

仍然很慢。

如何让这个选择运行更快?

UPDATE

enter image description here

UPDATE

estiamte plan

actual plan

1 个答案:

答案 0 :(得分:1)

答案取决于您未使用的用法,请更新您的问题。

您可以在MS SQL中使用物化视图别名index views,也可以创建一个临时表,其中包含您需要的所有信息,您可以从那里获取信息。

速度如此之慢的主要原因是LIKE的使用。你应该提出一种方法(通过执行计划)来​​删除它。