2011-02-01 20 views
0

数日前に私は1つのクエリを書いたが、すぐに実行されるが、今は1時間かかる。 このクエリはSQL7サーバー上で実行され、約10秒かかります。 このクエリは別のSQL7サーバー上に存在し、先週まで約 10秒かかりました。 両方のサーバーの構成が同じです。ハードウェアのみが異なります。Sqlクエリが遅すぎる

ここで、2番目のサーバーでは、このクエリは、詳細を抽出するのに約30分かかりますが、誰でも詳細を変更しています。

Whereを指定せずにこのクエリを実行すると、秒の詳細が表示されます。 問題がどこにある場合でも、このクエリにはほぼ同じ時間がかかります

+3

実行しているクエリを表示してください。 –

+0

クエリが長すぎて投稿できません。これは内部結合を使用して外部結合とユーザー定義関数を残し、他のデータベースにも結合します – sanjiv

+0

すべてのテーブルとインデックスの統計を更新しましたか? – Karl

答えて

0

クエリとおそらくデータを見ることなく、私はアドバイス以外の多くのことをすることはできません。

  1. より多くの制約をクエリに追加できますか?関係するデータの量を減らすことができれば、クエリの処理速度が向上します。
  2. あなたの結合で使用される列を見てください。whereとhaving節とorder by。列が属する表がこれらの列の索引を含んでいることを確認してください。
  3. ユーザー定義関数を使用する必要がありますか、別の方法で行うことはできますか?
  4. サブクエリを使用していますか?もしそうなら、これらを別々のビューに引き出すことができますか?

これが役に立ちます。どのくらいのデータがあなたのテーブルに行き、そしてあなたのスキーマを知られていない、それは見に決定的な答えが、物事を与えることは難しい知らず

0

  1. UPDATE STATSまたはDBCC REINDEXを実行してみてください。
  2. テーブルにインデックスがありますか?そうでない場合は、WHERE句とJOIN述語で使用される列に索引を追加してください。
  3. クロステーブルOR節(つまり、WHERE table1.col1 = @somevalue OR table2.col2 = @someothervalueの場合)を避けてください。 SQLはこの構文でインデックスを効果的に使用することはできません。クエリを2つに分割し、結果をUNIONにすると、パフォーマンスが向上する可能性があります。
  4. あなたの関数(UDF)は何を行い、それらをどのように使用していますか?関数がデータベースに対してselectを実行すると、データベースに対してn + 1回のクエリを実行することになります(n =メイン選択に返された行の数)。可能であれば、機能を試してみてください。
  5. LEFT JOINを使用している場合は、ジョインが正しいことを確認し、ロジックを再訪し、LEFTにする必要があるかどうか、またはINNER JOINに変換できるかどうかを確認してください。 LEFT JOINはLEFT JOINを使用することがありますが、残りのクエリでロジックを調べるとLEFT JOINは何も表示されないことがあります(たとえば、誰かが結合テーブルに対してWHERE col IS NOT NULLという述語を追加したためです)。 INNER JOINは高速化できるため、これらのすべてをレビューする価値があります。

私たちがクエリを見ることができれば、提案するほうがずっと簡単です。

関連する問題