問題

パフォーマンスチューニングが必要なクエリまたはストアドプロシージャがある場合、最初に試したことは何ですか?

  ベストアンサー

ここに私がいつも与えてくれるもののハンドイダンディーリストがあります。
または 私たちは主にSybaseを使用しますが、アドバイスのほとんどはボード全体に適用されます。

たとえば、SQL Serverにはパフォーマンス監視/チューニングビットのホストが付属していますが、そのようなものがない場合(おそらくそうしても)、次のことを考慮します...

私が見た99%の問題は、あまりにも多くのテーブルを結合に入れることによって引き起こされます。この修正は、結合の半分(テーブルの一部)を行い、結果を一時テーブルにキャッシュすることです。その後、その一時テーブルに参加するクエリの残りの部分を実行します。

最適化チェックリストのクエリ

  • 基礎となるテーブルでUPDATE STATISTICSを実行する または または 多くのシステムは毎週スケジュールされた仕事としてこれを実行します または
  • 基礎となるテーブルからレコードを削除する(削除されたレコードをアーカイブする可能性があります) または または これを1日に1回、または1週間に1回自動的に行うことを検討してください。 または
  • インデックスを再構築する
  • テーブルの再構築(bcpデータのアウト/イン)
  • データベースのダンプ/リロード(劇的ですが、破損を修正する可能性があります)
  • 新しい、より適切なインデックスを作成する
  • DBCCを実行して、データベースに破損があるかどうかを確認する
  • ロック/デッドロック または または データベースで実行されている他のプロセスを確実にする または または 特にDBCC または 行またはページレベルのロックを使用していますか? クエリを開始する前にテーブルを排他的にロックする すべてのプロセスが同じ順序でテーブルにアクセスしていることを確認する または
  • インデックスは適切に使用されていますか? または または 結合は、両方の式がまったく同じデータ型の場合にのみインデックスを使用します インデックスは、インデックスの最初のフィールドがクエリで一致する場合にのみ使用されます クラスタ化インデックスは適切な場所で使用されますか? または または 範囲データ value1とvalue2の間のフィールド または または
  • 小さなジョインは素敵なジョインです または または デフォルトでは、optimiserは一度に4つのテーブルしか考慮しません。 これは、4つ以上のテーブルと結合すると、非最適なクエリプランを選択する可能性が高いことを意味します または
  • 結合を分割する または または 別れてもらえますか? 外部キーを一時テーブルに保存する 結合の半分を実行し、結果を一時テーブルに入れる または
  • あなたは正しい種類の一時テーブルを使用していますか? または または #temp テーブルは、大きなボリューム (数千行) を持つ @table 変数よりもはるかに優れています。 または
  • 概要表を維持する または または 基礎となるテーブルにトリガを含むビルド 毎日/時間/ etcを構築します。 ビルドアドホック 段階的に構築するか、ターダウン/再構築する または
  • SET SHOWPLAN ON
  • SET STATS IO ON で実際に何が起こっているかを見てください。
  • pragma:(index:myIndex)を使用してインデックスを強制する
  • SET FORCEPLAN ONを使用してテーブルの順序を強制する
  • パラメータスニッフィング: または または ストアドプロシージャを2に分割する proc1からproc2を呼び出す @parameterがproc1によって変更された場合、optimierがproc2でインデックスを選択できるようにする または
  • ハードウェアを改善できますか?
  • あなたは何時に走っていますか?静かな時間はありますか?
  • レプリケーションサーバー(または他の非停止プロセス)は実行されていますか?それをサスペンドできますか?それを実行する。毎時?

  同じタグがついた質問を見る

sqlsql-serverdatabaseperformance