2

SQL Server 2012 を使用しています。

次のようなクエリを最適化しようとしています。

SELECT TOP 20 ta.id, 
              ta.name, 
              ta.amt, 
              tb.id, 
              tb.name, 
              tc.name, 
              tc.id, 
              tc.descr 
FROM   a ta 
       INNER JOIN b tb 
               ON ta.id = tb.id 
       INNER JOIN c tc 
               ON tb.id = tc.id 
ORDER  BY ta.mytime DESC 

クエリの実行には約 5 ~ 6 秒かかります。結合で使用されるすべての列のインデックスがあります。テーブルには 500k レコードがあります。

私の質問は次のとおりです。列 tc.name、tc.id、および tc.descr を選択から削除すると、クエリは 1 秒以内に結果を返します。なんで?

4

3 に答える 3

0

テーブルに追加のインデックスを追加することで、最終的にクエリを調整することができました。SQLサーバーは欠落しているインデックスを表示/示唆しませんでしたが、選択に存在するフィールドに新しい非クラスター化インデックスを作成することでそれを理解しました.

助けに来てくれてありがとう。

@Wadeリンクは、SQLオプティマイザを理解するのに非常に役立ちます

于 2013-04-11T18:50:14.970 に答える
0

違いを本当に知るには、実行計画を投稿する必要があります。

私の知る限り、SQL Server は結合を最適化しません。結局のところ、選択リストに列がなくても、結合を使用して行数をフィルタリングおよび乗算できます。

ただし、1 つのステップがスキップされる場合があります。の変数を使用してselect、エンジンはインデックスにアクセスし、データを含むページをフェッチする必要があります。変数がなければ、エンジンはフェッチを行う必要はありません。これにより、オプティマイザーのバランスが、あるタイプの結合から別のタイプの結合に微妙に傾く可能性があります。

2 つ目の可能性は、単純にタイミングに関するものです。クエリを 1 回実行すると、マシンのページ キャッシュがいっぱいになる可能性があります。2 回目に実行すると、データがメモリ内にあるという単純な理由で、クエリが大幅に高速化されます。(1) 各呼び出しの間にキャッシュをクリアするか、(2) キャッシュが同等に満たされていることを確認しない限り、決してタイミングを実行しないでください。

于 2013-01-23T00:22:27.260 に答える
0

クラスタ化インデックスはありますか? そうでない場合は、クラスター化インデックスを作成し、クエリ整数を実行し、主に主キー列に対して実行する必要があります。

クラスター化インデックスについては、http://msdn.microsoft.com/en-us/library/aa933131 (v=sql.80).aspx を確認してください。

于 2013-01-23T04:51:01.280 に答える