1

実行計画で次のクエリを実行すると、「並べ替え」が最もコストリストのタスクであることがわかりました。しかし、クエリで並べ替えオプションを使用していません。なぜそれが起こっているのですか?選択の前にネストされたループ結合タスクが存在します。マージ結合、ハッシュ結合、ネストループ結合についても教えてください。

ここに画像の説明を入力

select
Ename from dbo.Employee e
where 
Salary>(
select AVG(Salary) from dbo.Employee where 
DeptId=e.DeptId 
group by DeptId)
4

2 に答える 2

5

TerritoryID ごとにどの行の給与が低いかを判断するために並べ替える必要があります。したがって、この並べ替えは、このパーティショニング/グループ化によるものです。

次のようなインデックスを使用して、並べ替え操作を取り除くことができます。

CREATE INDEX d_s ON dbo.Employee(DeptId, Salary);

ただし、このクエリが実行される頻度の観点から、追加のインデックスが正当化されるかどうかを判断する必要があります。これは、ワークロードの他の部分に影響を与える可能性があります。ある時点で、並べ替え/グループ化の費用がかかります。

また、クエリ内のコストが高いからといって、これが問題であるとは限りません。このクエリは遅いですか? F1 レースでさえ、最下位でフィニッシュする「遅い」車があります。

于 2012-06-03T15:23:20.900 に答える
3

SQLクエリでは、実際にデータを列のグループにソートする(Ename)Sortがパフォーマンスのボトルネックになる可能性がありますが、見つける必要があります。ソートが実際にパフォーマンスの問題を引き起こしている場合は、Aaaroon Bertrandが提案するようにインデックスに移動できます。

ネストされた結合の理由は、SQLserver が実際に 2 つのクエリを実行して結果を返すことです。

1 つはサブクエリに書き込まれた Avg(Salary ) で、もう 1 つは Clustered index Scan を使用して行われる Employee テーブルから Ename を選択する外部クエリです。これら 2 つのクエリを組み合わせて、目的の結果を返します。基本的に、サブクエリの各行を述語を満たす外部クエリの各行と比較しています。

マージ結合は、結合する列にインデックスがある場合にのみ可能です。マージ結合は、既にソートされているため、非常に高速な場合があります。

詳細な説明については、以下のリンクを参照してください。 ネストされた結合 ハッシュ結合 マージ結合

于 2012-06-03T16:08:27.417 に答える