11

タスクとメモを含む2つのテーブルがあり、それぞれに関連付けられたメモの数を含むタスクのリストを取得したいと思います。これらの2つのクエリが機能します。

t.TaskIdを選択し、
       (タスクノートnからcount(n.TaskNoteId)を選択します。ここでn.TaskId = t.TaskId)'ノート'
タスクtから

-  また
t.TaskIdを選択し、
       count(n.TaskNoteId)'メモ'
タスクtから
左参加
       TaskNote n
on t.TaskId = n.TaskId
t.TaskIdによるグループ化

それらの間に違いはありますか?私は一方を他方の上に使用する必要がありますか、それとも同じ仕事をするための2つの方法だけですか?ありがとう。

4

7 に答える 7

12

小さなデータセットでは、パフォーマンスに関してはウォッシュです。インデックス化すると、LOJ は少し良くなります。

大規模なデータセットでは、内部結合 (内部結合も機能します) がサブクエリよりもはるかに優れていることがわかりました (申し訳ありませんが、数値はありません)。

于 2008-09-22T22:29:13.557 に答える
6

ほとんどの場合、オプティマイザーはそれらを同じように扱います。

ネスティングが少なく、読みやすく、保守しやすいため、私は 2 番目を好む傾向にあります。同じ理由で、ネストを減らすために SQL Server の共通テーブル式を使い始めました。

さらに、2 番目の構文は、MIN(some_scalar)、MAX()、AVG() などのように、COUNT に加えて将来追加される可能性のある集計がある場合により柔軟です。

于 2008-09-22T22:29:47.657 に答える
5

サブクエリは、外側のクエリのすべての行に対して実行されるため、遅くなります。結合は一度で済むので高速になります。同等性を認識できないため、クエリ オプティマイザはこのクエリ プランを書き換えないと思います。

通常、この種のカウントに対しては結合とグループ化を行います。表示されている種類の相関サブクエリは、別の結合に参加していないテーブルでグループ化またはより複雑な述語を実行する必要がある場合に主に役立ちます。

于 2008-09-24T15:54:00.853 に答える
2

SQL Server Management Studio を使用している場合は、両方のバージョンをクエリ エディターに入力し、右クリックして [推定実行プランの表示] を選択します。バッチに対して 2 パーセントのコストが得られます。同じ時間がかかると予想される場合は、どちらも 50% と表示されます。その場合は、他の理由 (読みやすい、保守しやすい、コーディング標準により適しているなど) で好みの方法を選択してください。それ以外の場合は、バッチに比べてコストの割合が低いものを選択できます。

同じ手法を使用して、同じことを行う 2 つのバージョンを比較することで、クエリを変更してパフォーマンスを向上させることができます。

もちろん、これはバッチに関連するコストであるため、どちらのクエリも可能な限り高速であることを意味するわけではありません。同じ結果を得るための概念的な最適クエリではなく、それらが互いにどのように比較されるかを示しているだけです。 .

于 2008-09-22T22:46:23.063 に答える
1

可能な限りサブクエリを避けるようにしています。通常、結合はより効率的です。

于 2008-09-25T18:26:06.377 に答える
1

これには明確な答えはありません。SQL計画を表示する必要があります。関係代数に関しては、それらは本質的に同等です。

于 2008-09-22T22:23:21.247 に答える
0

どちらも使用でき、意味的には同じです。一般に、経験則では、パフォーマンスが問題にならない限り、読みやすい形式を使用します。

パフォーマンスが問題になる場合は、他のフォームを使用してクエリを書き直してみてください。オプティマイザは、一方のフォームにインデックスを使用し、もう一方のフォームにはインデックスを使用しない場合があります。

于 2008-09-22T22:20:33.703 に答える