私たちは SQL Server 2012 EE を使用していますが、現在 R/O ミラーでクエリを実行するオプションはありませんが、それは私の長期的な目標ですが、ミラーがまた、私が照会しているデータを更新しています。
2 つのデータベースの複数のテーブルを結合するビューがあり、既存のデータからの請求に使用されます。これらのテーブルのうち 3 つも、進行中のトランザクションによって積極的に更新されます。このビューを使用するレポートを実行することは以前は問題ではありませんでしたが、データベースが大きくなり、タイムアウトの問題が発生しました。最初にクエリがタイムアウトしたため、コマンド タイムアウトを 0 に設定し、4 つの CPU すべてを 90 分間 100% 固定するクエリを再実行してから、強制終了しました。その間、アクティブなトランザクションに問題はありませんでした。クエリを確認したところ、インデックスが作成されていない参加しているフィールドが見つかったので、そのフィールドにインデックスを作成し、レポートを再実行しました。レポートは 3 分で終了し、すべての CPU はビジー状態でしたが、固定されていませんでした。両方の回で同じデータ量がクエリされました。私は問題が解決したと考えました。もちろんその後、私の上司は同様のクエリを実行しました。データは多少多いかもしれませんが、それほど多くはないかもしれません。クエリの実行中に、ライブ トランザクションが 100% タイムアウトし始めました。その間、CPU 使用率を確認する機会がありませんでした。
だから私の質問は2つです:
ライブおよびアクティブなデータベースを使用する必要がある場合、アクティブなトランザクションを継続できるように長い R/O クエリを実行する適切な方法は何ですか? NO LOCK を検討していますが、より良い標準的な方法があることを願っています。
そして、sqlserver が 100% ビジー状態で 4 つの CPU をペグアウトし、ライブ トランザクションのタイムアウトを引き起こさない可能性がありますが、上司がクエリを実行したときに、インデックスを追加してクエリがはるかにうまく実行された後、ライブ更新トランザクションが 100% タイムアウトし始めます。 ?
これは多くの情報ではないことはわかっています。私はSQLプロファイリングとパフォーマンス監視にあまり詳しくありませんが、この動作はかなり奇妙に思え、ベストプラクティスが正しい回避策になることを望んでいます.