2011-01-03 7 views
0
SELECT o.oxxxxID, 
     m.mxxxx, 
     txxxx, 
     exxxxName, 
     paxxxxe, 
     fxxxxe, 
     pxxxx, 
     axxxx, 
     nxxxx, 
     nxxxx, 
     nxxxx, 
     ixxxx, 
     CONVERT(VARCHAR, o.dateCreated, 103) 
FROM Offer o INNER JOIN Mxxxx m ON o.mxxxxID = m.mxxxxID 
      INNER JOIN EXXXX e ON e.exxxxID = o.exxxxID 
      INNER JOIN PXXXX p ON p.pxxxxxxID = o.pxxxxID 
      INNER JOIN Fxxxx f ON f.fxxxxxID = o.fxxxxxID 
WHERE o.cxxxxID = 11 

上記のクエリは、毎日約1000人の訪問者によってウェブサイト経由で実行される予定です。 これはひどく書かれており、パフォーマンスが低下する可能性が高いですか?はいの場合は、改善方法を教えてください。私のT-SQLクエリは効率的に書かれていますか?

注:すべてのテーブルには1つのインデックス(プライマリキー)しかありません。

+1

あなたが行ったすべての置換えは、これを非常に読みにくくします。それを超えると、テーブルの構造とそのインデックスが何であるかを知らなくても、この質問に有益な答えを与えることはおそらく現実的ではありません。 –

+2

クエリプランの見積もりには何が表示されますか? (私は実際に下降を止めています:これらの種類の質問が内部的に答えることができるように、提供される基本的なツールに精通していることを確認してください。しかし、これは別の形式の質問で尋ねられるでしょう)。 –

+1

私は確かに**すべてのテーブルの外部キー列にインデックスを入れます。 JOINのパフォーマンス –

答えて

2

データの内容を知らなくてもわかりにくいですが、完全に有効なSQL文のように見えます。多くの結合がパフォーマンスを少し低下させる可能性がありますが、パフォーマンスを向上させるためにfw戦略を使用できます...私はいくつかのアイデアを持っています。

  • インデックス付きビューは、多くの場合、パフォーマンスを向上させることができ
  • ストアドプロシージャはあなたのためのクエリをoptomizeとoptomizedクエリ
  • または可能な場合を保存、生きていないワンオフのテーブルを作成しますが、からのデータが含まれていますこの文は、正規化されていない形式でのみ表示されます。このオン/オフテーブルでは、定期的にTPを更新する必要がありますが、可能であれば、この戦略を使用してパフォーマンスを大幅に向上させることができます。
  • 一般的なパフォーマンスの問題やアイデアについては

あなたはalredyいない場合、これは、開始するには良い場所です:http://msdn.microsoft.com/en-us/library/ff647793.aspx

この1つは、同様に非常に良いです:http://technet.microsoft.com/en-us/magazine/2006.01.boostperformance.aspx

+0

マイノート:たくさんの内部結合があるときの唯一の時間(小さなデータセット〜200k)は、適切な被覆指数を使用していないときです。また、インデックスとテーブルの配置は大きな違いになります(例:小さなテーブルスキャンは非常に安い)。クロス・ジョイン... –

2

これは、ほとんどの場合、テーブルに定義されているキーとインデックスに依存します。あなたがそれらを提供できるなら、より良い答えが与えられます。クエリがok(xxxのすべての名前)以外の場合、インデックスのないフィールドに結合する場合、またはwhere句のフィールドにインデックスがない場合、大きなデータセットでパフォーマンスの問題が発生する可能性があります。

1

実際、クエリは完全によく書かれているようです。改善できるかどうかわからない唯一の点は、JOINSおよびWHEREステートメントで使用している列にインデックスとキーが存在することです。それ以外に、私は改善できるものは見当たりません。

2

それは私にはかなりよく見えます。おそらく唯一の改善点は、o.datecreatedをそのまま出力して、クライアントにそれをフォーマットさせることです。

また、結合列にインデックスを追加することもできます。

パフォーマンスが問題でスペースがない場合は、インデックス付きのビューを作成する可能性もあります。

3

私によく見えます。

パフォーマンス・パーツでは、フィルタリングと結合(外部キーなど)をカバーする適切なインデックスがあることを確認する必要があります。

実際の実行計画を実行するのがよいでしょう。簡単な方法は、Indexing Tuning Wizardに対して実行することです。

SQL 2008の実際の実行計画(たぶん2005も同様)は、すでにインデックスのヒントが不足しています。

1

だけしている場合主キーに対する単一の索引を使用すると、select文で出力されるすべてのデータに対して索引が適用されることはありません。したがって、クエリは各主キーの行を効率的に見つけることができますが、ブックマークルックアップを使用してデータ行を見つけて追加の列を抽出する必要があります。

したがって、これらの列がすべて実際に出力に必要である限り、クエリ自体はおそらく(日付変換を除いて)うまくいくかもしれませんが、インデックスに列を追加することによって実行計画が改善される可能性があります。クラスタード・インデックス・キーには列を含めることはできません。これはおそらくプライマリー・キーの適用でもあります。主キーに他の列を追加することはほとんどありません。 PK列を追加し、追加の列を追加します。

この時点で、インデックスはクエリをカバーし、ブックマークの参照を行う必要はありません。インデックスは最も一般的な使用シナリオをサポートする必要があり、追加するインデックスが多いほど、すべてのインデックスを更新する必要があるため、書き込みパフォーマンスは遅くなります。

さらに、オプティマイザが外部結合が存在しないと判断できる場合に、出力列にテーブルが使用されていない場合に、オプティマイザが結合を排除するために使用できるため、制約を確認することもできます。行を削除または掛けるクロス結合。

関連する問題