2011-12-19 17 views
0

私は3つのテーブルa、b、cを持っています。SQLクエリのパフォーマンスを改善する必要があります

select * from a 

select * from b where aid in (select id from a) 

select * from c where bid in (select Id from b where aid in (select id from a)) 

これらのクエリはspで正常に機能しますが、パフォーマンスとしてはこれらを最適化する必要があります。 パフォーマンスを向上させる方法や、 SQLクエリを最適化するためのツールを提案してください。

ありがとうございました。

+1

"うまくいきます" - なぜあなたはパフォーマンスの問題があると思いますか? –

+0

正常に動作することは適切な結果を与えることを意味しますが、3番目のクエリでは2つのサブクエリを渡しています。その場合には、次にidのidがbのidになるので、時間がかかるので、別の方法があります。 – Areeb

+0

私は、SQL Server 2008には、チューダー・コンスタンタンが提案した内部結合を使用してあなたのばかげた非効率なSQLコードを実装するために十分な最適化ツールがあると仮定します。だから、Anders UPが示唆したように適切なインデックスを指定することでパフォーマンスの向上が見込まれることに、もっと喜んで喜んでいます。場合によっては、これらの提案を試した後に起こったことをお知らせください。 –

答えて

0

ようにあなたがあなたのクエリを表現することができます:私はあなたがINNER JOINを使用してクエリを書き換えることができると思い

select * from b where b.aid = a.id and a.somefield = 'value' 
3

select * from c 
INNER JOIN b ON b.id = c.bid 
INNER JOIN a ON a.id = b.aid 

あなたはID、入札に索引を持っているし、すべてを支援する場合

問題ないはずです
2

クエリが遅い理由はたくさんあります。あなたが何を記述するかで、いくつかの出発点があります:

  • インデックスがないか間違っています。最低でも、結合またはフィルタリングする列には索引が必要です。
  • インデックスの統計は最新のものでなければなりません
  • インデックスは、含まれているカラムとしてより多くのフィールドを持つことによって利益を得ることができます。
  • 返されるデータの正確な量 - 列と行の両方で返されます。あなたがあまりにも多くを返すと、さまざまなバッファを氾濫させ、全体的なパフォーマンスを低下させます。

起動時にSQL Serverフォルダの下にある[パフォーマンスツール]メニューの両方で、チューニングアドバイザおよびSQL Serverプロファイラの両方を使用できます。

また、管理スタジオの報告の可能性を学び、実行計画を知ることは良い出発点です。

より高度な学習者の方は、クエリのI/O(管理スタジオクエリウィンドウ内)の統計情報を開始し、Windowsパフォーマンスモニタを使用して関連するSQL Serverカウンタなどに注目してください。 http://www.sql-server-performance.com/2005/sql-server-performance-monitor-coutners/

0

INの代わりにexistを使用することもできます。助けることができるデータの充当がある場合:

SELECT 
    * 
FROM 
    a 

SELECT 
    * 
FROM 
    b 
WHERE EXISTS 
    (
     SELECT 
      NULL 
     FROM 
      a 
     WHERE 
      a.id=b.aid 
    ) 

SELECT 
    * 
FROM 
    c 
WHERE EXISTS 
    (
     SELECT 
      NULL 
     FROM 
      b 
     WHERE 
      c.bid=b.Id 
      AND EXISTS 
      (
       SELECT 
        NULL 
       FROM 
        a 
       WHERE 
        b.aid=a.id 
      ) 
    ) 
0
  1. *の使用を避けてください。列名を明示的に記述する。
  2. 多数のレコードを持つテーブルに非クラスタ化インデックスを使用します。
  3. サブクエリの代わりにジョインを使用します。
  4. ストアドプロシージャの "NoCountを"に設定してください。
  5. 一時表を使用できます。必要なデータを挿入し、最後に実行します。ストアドプロシージャを終了する前に、それを削除することを忘れないでください。
関連する問題