2012-03-12 15 views
0

SQLクエリを最適化しようとしています。GROUP BYクエリの最適化

SELECT Code, COUNT(*) 
FROM  tblData 
WHERE ListID = 380 
GROUP BY Code 

表には1000万レコードが含まれています。 SQL SERVER 2008 R2のレコードを検索するには、クエリに通常4〜5秒かかります。

SELECT a.Code, COUNT(*) 
FROM ( SELECT * 
      FROM tblData 
      WHERE ListID = 380 
     ) a 
GROUP BY a.Code 

私のテストでは正確に同じ結果が得られましたが、それを表現する別の方法が見つかりました。しかし、これが以前のものより速いのか、それとも逆ののかは疑問です。何か案が?

+2

インデックスを作成していて、クエリプランナー/アナライザは何を教えてくれますか? – YXD

+0

ところで、* SQL Server 2010 *はありません。あなたは*(2010年にリリースされた)SQL Server 2008 R2 *を意味しましたか? –

+0

はい、私はそれを意味します。私は実際にバージョン10.50..lolと混乱してしまいます。訂正してくれてありがとう。 –

答えて

4

適切なクエリオプティマイザを使用すると、2つのクエリはまったく同じ操作になります。だから私はあなたが同じ時間に走っているのに驚くことはありません。

クエリを変更してより速く実行できるとは思いません。あなたができることは、もちろん、ListIDのインデックスを持つことです - しかし、あなたはすでにそれを持っていると思います。

+0

LISTIDはプライマリキーであるため、既にIndexになっています。グループ化されているため、Index on Codeも作成します。しかし、私はまだこのプロジェクトのメインテーブルなので、最適化したいと思っています。 –

+2

@Mitchによって提案された '(ListID、Code)'のインデックスが役立つかもしれません。それ以上に、私はそれを改善する方法を見ていない。 'ListID'値がごくわずかでなければ、' tblData'をいくつかのテーブルに分割して独立してクエリしたいので、 'where'節を避けるようにしてください(免責:それは醜いです!) – cornuz

+0

Okak、両方のフィールドに個別にインデックスを持っていますが、コードとリストIDの組み合わせで3番目のインデックスを作成します。これにより、クエリの最適化が1秒未満に短縮されます。 –

0

Management Studioで両方のクエリを選択し、[推定実行計画を表示]をクリックします。 1つのクエリコストが50%と異なるとすぐに、勝者(および敗者)が得られます。

2番目のクエリは、アナライザを通過した後の最初のクエリの結果として表示されます。私は両方がまったく同じように動作すると思います。

3

@cornuzと@Wimの両方が言ったように、これらの2つのクエリは同等でなければなりません。

ただし、データベースだけでインデックスではなく、テーブルを訪問する

  1. ので(ListId [コード上の)2カラムのインデックスを持つことは、パフォーマンスにかなり改善することがあります。
  2. を一緒に数える必要がある行をまとめてインデックスに追加ソートする必要はありません。