2017-08-09 14 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'の代わりに' UNION ALL'を使用してみてください。なぜなら、 'UNION'は実際には別個の値を返すようにしているからです。 –

+0

いいえ、SQL Server管理で実行すると、非常に遅いですが、10レコードの結果を返すためには35〜40回かかりますが、それは非常に遅いです。 – Martin

答えて

1

答えは、あなたの質問にアップデートしてください、あなたが指定されていませんでした、使用状況によって異なります。

MS SQLでマテリアライズド・ビューの別名index viewsを使用することも、必要なすべての情報を含む一時表を作成してそこから情報を取得することもできます。

なぜそれほど遅いの主な理由は、LIKEの使用です。それを削除する方法(実行計画を介して)を考え出す必要があります。

関連する問題