0

今日、同僚から質問がありました

「4つの選択クエリを含むSQLスクリプトがあります。1か月以上毎日使用していますが、昨日同じクエリに2時間かかり、実行を中止する必要がありました。」

彼の質問は

  • Q1。その日、このスクリプトはどうなりましたか?
  • Q2。実行されたクエリと中止の原因が1つある4つのクエリを確認するにはどうすればよいですか?

Q2に対する私の答えは、SQLプロファイラーを使用し、SQLステートメントイベントのトレースを確認することでした。

Q1について:私は彼にいくつか質問をしました

  1. その日のデータ量はどのくらいでしたか? 彼の答え:変化なし
  2. インデックス作成に変更はありましたか?つまり、誰かがインデックス作成を削除した可能性がありますか?彼の答え:変化なし
  3. データ管理ビューをチェックして追跡することにより、デッドロックに陥りましたか?彼の答え:行き詰まっていない

他に何を考えるべきだったと思いますか?これには他に理由がありますか?

クエリが表示されなかったため、ここに貼り付けることはできません。

4

3 に答える 3

1

注目すべき点(SQL Server):

  1. 統計が古くなっていますか?誰かが大規模な一括挿入操作を実行しましたか?を実行しますupdate statistics

  2. インデックスの変更?その場合、それがストアドプロシージャである場合は、実行プランを確認するか、再コンパイルします...次に、実行プランをもう一度確認して、問題を修正します。

  3. SQLServerは実行プランをキャッシュします。クエリがパラメータ化されているか、if-then-elseロジックを使用している場合、最初に実行するときに、パラメータがエッジケースの場合、キャッシュされた実行プランは通常の実行ではうまく機能しない可能性があります。あなたはこれについてもっと読むことができます...ああ...機能:

于 2012-12-12T17:53:27.890 に答える
0

この場合、私のアプローチは次のようになります。

  1. この場合、クエリに予想以上の時間がかかり、最終的に完了しなかったため、実行を中止する必要がありました。私の理解によると、クエリしているテーブルに対してブロッキングセッション/コミットされていないトランザクションがある可能性があります(その日に別のユーザーによって実行されます)。'select'ステートメントを実行していたので、私が知っているように、' select'ステートメントは他のトランザクションが完了するのを待つために使用されました(トランザクションが' select'の前に実行された場合)。クエリは、他のトランザクションが完了するのを待機している可能性があります(トランザクションには更新/挿入または削除がある可能性があります)。ブロッキングセッションがある場合はそれを確認します。

  2. シングルセッションの場合、SQLサーバーはスレッドを切り替えます。クエリを含むスレッドが「一時停止」/「実行中」または「実行可能」モードになっていることを確認する必要があります。あなたの場合、クエリは一時停止モードになっている可能性があります。クエリがどのモードであるか、およびその理由を調査します。

  3. 次は断片化です。ベストプラクティスは、不要な断片化を取り除くのに役立つインデックスの再構築/再編成ジョブを環境に構成することです。そのため、データを返すときにクエリがスキャンする必要のあるページ数が少なくなります。そうしないと、クエリがデータを返すのにますます時間がかかります。ジョブを構成し、少なくとも週に1回ジョブを実行します。インデックスとページを更新し続けます。

于 2018-07-13T09:22:11.790 に答える
-1
  • EXPLAINを使用して、4つのクエリを分析します。これにより、オプティマイザがインデックスをどのように使用するか(またはインデックスを使用しないか)がわかります。

  • スクリプトSELECT NOW()のステートメントの間にクエリを追加して、各クエリにかかった時間を測定できるようにします。NOW()をセッション変数に格納し、TIMEDIFF()を使用してステートメントの開始と終了の差を計算することにより、MySQLに算術演算を実行させることもできます。

    SELECT NOW() INTO @start;
    SELECT SLEEP(5); -- or whatever query you need to measure
    SELECT TIMEDIFF(@start, NOW());
    
  • @Scottはコメントで、低速のクエリログを使用して、実行時間の長いクエリの時間を測定することを提案しています。

  • 実行時間の長いクエリを特定したら、クエリの実行中にクエリPROFILERを使用して、時間を費やしている場所を正確に確認します。

于 2012-12-12T17:52:59.517 に答える