2017-08-09 54 views
1
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 

這是我的選擇與工會和子查詢和喜歡,這是返回OK結果卻是很慢的。所以我把工會變成了JOIN,我得到了這個MSSQL與工會子查詢選擇加入,並希望很慢

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

看看執行計劃,https://www.red-gate.com/simple-talk/sql/performance/execution-plan-basics/ – Leonidas199x

+0

你擔心重複?如果沒有,請嘗試使用'UNION ALL',而不是'UNION',因爲'UNION'實際上是確保返回不同的值。 –

+0

不,它只是非常緩慢,當我在sql服務器管理中運行它需要大約35 - 40返回10條記錄的結果,它很慢 – Martin

回答

1

答案將取決於你的使用情況,您沒有指定,請更新您的問題。

您既可以在MS SQL中使用物化視圖別名index views,也可以創建一個臨時表,其中包含所需的所有信息,您可以從該表中獲取信息。

的主要原因爲什麼它是如此之慢是LIKE使用。你應該想出一個辦法(通過執行計劃),將其刪除。