2016-12-06 13 views
0

多くの左外部ジョインがある複雑なクエリがあります。Microsoft SQL Serverクエリは、select distinct vs select countに基づいて最適化されていません。

私はフィルタを備えたカップルのテーブルとそのクエリ

select distinct top X [table1].[column1] 
from .... 

を取る、とに比べて大幅に異なるクエリプランを見てみると:

select count(distinct [table1].column1) 
from .... 

私が気づくことは、すべて左が参加していますwhere文節またはselect文節のフィルターに必要でない私のステートメントの中で、select distinct文のためにオプティマイザによって削除されますがselect count文のためにはありません。

私はMicrosoft SQL Server 2014をエンジンとして使用しています。

私はselect distinctがジョインをどのように削除しているのだろうと思っています。これはselect countを提供できるクエリヒントです。

明確な理由からselect distinctがselect countよりも優れています。select countも同様に機能します。あなたはleft joinのが、無where句を持っている場合は

おかげ

+0

SQLクエリを追加 –

+0

実行プランを入手してhttp://pastetheplan.comに投稿し、ここにリンクを投稿してください。 – alroc

答えて

0

は、その後、最初のテーブルのすべての行は、結果セットに残っています。私は考え、

select count(distinct [table1].column1) 
from table1; 

これはwhere句を含むように一般化することができ、そのために必要なジョイン:彼らは参加したが、明確な値の数が同じであると何が起こるかに応じて、繰り返される可能性があります。

理論的には、これはcount()もなく同じです。 。 。

select distinct [table1].column1 
from table1; 

SQL Serverがこの最適化を全く認識していることに驚いています。他の状況でなくてもcount(distinct)のためにそれを認識するのは良いことだと思います。

関連する問題