MS SQL Serverは時間の経過とともに遅くなりますか?


8

次のいずれかを経験し、解決策を見つけましたか。

私たちのウェブサイトのバックエンドの大部分はMS SQL Server 2005です。毎週または2週間、サイトの実行が遅くなり、SQLでのクエリの完了に時間がかかります。使用したいクエリがあります。

USE master
select text,wait_time,blocking_session_id AS "Block",
percent_complete, * from sys.dm_exec_requests 
CROSS APPLY sys.dm_exec_sql_text(sql_handle)  AS s2 order by start_time asc

これはかなり便利です... SQLサーバーに対してその時点で実行されているすべてのスナップショットを提供します。なんらかの理由でCPUが100%に固定されていて、Activity Monitorがロードを拒否している場合でも(一部のユーザーはそこにいると思います)、このクエリは引き続き返され、どのクエリがDBを強制終了しているのかを確認できます。

これを実行したり、SQLの速度が低下し始めたときにアクティビティモニターを実行したりすると、問題の原因となっている特定のクエリが表示されません。MS SQLサービスを再起動すると、すべてが正常になり、速度が速くなります-再び発生するまで1〜2週間。

何も変わったことはないと思いますが、これはほんの数ヶ月前に始まったばかりです…アイデア?

-追加

このデータベースの速度低下が発生した場合、1時間に10万ページビュー(1日のビジー時間)または1時間に1万ページビュー(遅い時間)を取得しても、すべてのクエリの完了に通常より長い時間がかかることに注意してください。サーバーは本当にストレスを受けていません-CPUは高くありません、ディスク使用量は制御不能ではないようです...それはインデックスの断片化または一種のようなもののように感じますが、それはそうではないようです場合。

上に貼り付けたクエリの結果を貼り付ける限り、実際にはできません。上記のクエリは、タスクを実行するユーザーのログイン、クエリ全体などを一覧表示します。データベース、テーブル、列、およびログインの名前をオンラインで渡したくありません:)... Iその時点で実行されているクエリは、常時実行されている通常の標準クエリであり、標準的なものではありません。

-3月24日

前回の再起動から約2週間になります。いくつかの変更を加えました。一時テーブルを頻繁に使用していて、まったく不要なクエリをいくつか見つけ、開発者にその方法を変更させました。常に(ゆっくりと確実に)成長しているいくつかのデータベースのサイズを、その成長に合わせてインテリジェントなサイズに調整しました。すべての自動拡張の設定も調整して、よりインテリジェントになりました(すべてが1 MBの拡張に設定されていました)。最後に、MSDBを少しクリーンアップしました。私たちはログ配布を行っており、何年も何年にもわたるバックアップポイントを保持する必要はありませんでした。これを数か月だけに保つスクリプトをいくつか作成しました。問題がまだ解決されているかどうかを判断するには時期尚早なので、このスレッドを更新し続けます。


Management Studioを通じて同じクエリを実行した場合、アプリケーションを通じて実行された場合と同じパフォーマンスの問題が発生しますか?パフォーマンスの低下を停止または解消するものは何ですか?サーバーを再起動しますか?これは物理サーバーですか、それともVMですか?独自のストレージがありますか、それともSANの一部ですか?
DCNYAM

ネットワーク接続ストレージ、正確にはMD 3000。SQLサービスを再起動すると、SQLサービスはなくなります。はい、その間にスタジオからの同じ遅い応答時間が表示されます。
デイブホーランド

回答:


3

我々はそれを見つけた。実際には、アプリケーションプールの1つに問題があったのはWebサーバーでした。同じクエリのセットを何度も繰り返し実行するとスタックします(たまたま一時テーブルで処理されていました)。ループしてループし、最終的にSQLサーバーを悲しくします。この問題のあるマシン/アプリプールが見つかり、すべて「解決」されました。


2

SQLサービスの再起動時に何が起こるか自問する必要がありますか?多くのことですが、2つの関連する点が頭に浮かびます:

1)SQLメモリが解放されます。

MaxMemoryの設定が高すぎると、SQLサービスが利用可能なすべてのメモリを使用するようになり、Windowsが重要なものをスワップファイルにスワップし始める可能性があります(その可能性はわかりません)。MaxMemoryが適切な値に設定されていることを確認し、そのボックスで実行する必要がある他のすべてのメモリを十分に残します(専用のSQLサーバーですか、それともアプリサーバーですか?)

2)TempDBはデフォルトサイズから再構築されます。

デフォルトのtempdbファイルのサイズ、特にTempDBログファイルのデフォルトのサイズと拡張間隔を確認します。成長間隔の設定が低すぎると、ログが信じられないほどの内部断片化を構築し、通常の使用を大幅に遅くする可能性があります。Kimberly Trippによるこれら 2つの優れたブログ記事を参照してください。


1)マシンは、16GBのメモリを備えた専用SQLサーバーであり、14GBがSQLに割り当てられています。2)DBのサイズと成長にいくつかの調整を行ったので、再起動する必要はありませんでした。一時テーブルは私が行った調整に含まれていたため、何らかの影響があった可能性があります。ほんの数週間しか経っていないので、状況が再び発生するかどうか私は待っています。
Dave Holland

1

一時テーブルまたはカーソルを多用していますか?カーソルが閉じられ、正しく割り当て解除されていることを確認してください。また、リンクサーバーにも注意してください。古いリンクされたInformixサーバーにはバグのあるドライバーを使用する必要があり、定期的にサーバーを再起動する必要があることを意味します。


私たちは、私たちはあまりにも頻繁に使用しないことを望むカーソルをかなりの数の一時テーブルコールを使用するのですが、私はそれは仮定です、私はそれに見えるものとなるよう、私たちの古いコーディング「基準」の一部を知ることも可能。リンクサーバーは1つしか使用していませんが、別の2005 sql DBに使用しています。
Dave Holland

0

変に見える場合は、変を探してください。

SQLサーバーの設定を調整してもWindowsタスクマネージャーを試すことができない場合は、[プロセス]タブに移動し、[オプション]> [列]> [CPU時間]、[ハンドル]、[読み取り]、[書き込み]、その他、およびメモリオプションを追加します。

プロセスリストに戻ります。各列について、最高から最低まで並べ替え、上位5つのプロセスを確認します。異常なことはありますか?たとえば、プロセスのメモリリークには、奇妙な数のハンドルが含まれます。2秒ごとにDCSLoaderプロセスにハンドルを追加する* kiプリンターがいくつかあります。数週間後、マシンは多くの空きメモリとCPUをリストしますが、100,000のハンドルを持つプロセスはほとんどマウスポインタを動かしません。

スケジュールされたタスクのリストも確認してください。AVに.mdfファイルをスキャンしないように伝えます。


ええ、私はすべてを実行しました。プロセスリストの何も異常ではありません。前述したように、マシンを再起動しません。SQLサービスを再起動するだけで問題が解決するので、問題が発生することはほとんどありません。 SQL Serverプロセス以外の問題を見つけるため。ハンドルを見るのは良い考えですが、次回は確認します。
デイブホーランド

0

デイブ、

待機統計を確認しましたか?上記で与えたクエリは 'last_wait_type'列をリストします。その列には、クエリが待機しているもの(ネットワーク、CPUなど)に関する詳細が含まれる場合があります。


私はしていませんが、すべきです。次回これが起こることを確認します。
Dave Holland

0

バックアップの「復旧モデル」がフルの場合、DBのバックアップを取り、次にトランザクションログのバックアップをとることで、事態は改善されますか?ディスク領域が不足しているシステムでは、この種のことが問題を説明している可能性があります。


すべてのDBは15分ごとにログに記録されて出荷されます。つまり、DBとトランスのログは常にバックアップされるため、問題ではありません。それらはすべて、約3テラバイトの空き領域があるmd3Kで実行されています。
Dave Holland

知っておくと良い。SQLクライアントはどのような方法でSQLサーバーに接続しますか?それでも、たくさんの質問。サーバーは64ビットですか?
djangofan 2010年

クライアントは.net Webサイト(toolbox.com)であり、はい64ビットです。
Dave Holland

それで、あなたの.netクライアントはjdbc2.xドライバーを使用していますか、そしてそれらは統合認証を使用していますか?
djangofan 2010年

0

私はあなたと非常によく似た構成(16Gb、32Gbにアップグレード、テラバイトのディスクを搭載したMD1000、デュアルクアッドコアxeon)を持っているようです。

私は、過去にそのような奇妙な問題を診断役立っている唯一のものはあるbeta_lockinfo Erland Sommarskogによります。遅い時間に実行して比較してください。

また、SP2以前のSQL 2005で非常に多くの問題がありましたが、SP3は本当に安定しています。


実は覚えたばかりです。「メモリ内のページのロック」を使用してみてください。CU4 for SP3を使用すると、SQL 2005 Standardでも使用できます。blogs.msdn.com/suhde/archive/2009/05/20/…を
Ricardo

0

これがより有用な情報を与えることを願っています:

SELECT  D.text SQLStatement,
        A.Session_ID SPID,
        C.BlkBy,
        ISNULL(B.status, A.status) Status,
        A.login_name Login,
        A.host_name HostName,
        DB_NAME(B.Database_ID) DBName,
        B.command,
        ISNULL(B.cpu_time, A.cpu_time) CPUTime,
        ISNULL((B.reads + B.writes), (A.reads + A.writes)) DiskIO,
        A.last_request_start_time LastBatch,
        A.program_name
FROM    sys.dm_exec_sessions A
        LEFT JOIN sys.dm_exec_requests B
        ON A.session_id = B.session_id
        LEFT JOIN (
                   SELECT   A.request_session_id SPID,
                            B.blocking_session_id BlkBy
                   FROM     sys.dm_tran_locks AS A
                            INNER JOIN sys.dm_os_waiting_tasks AS B
                            ON A.lock_owner_address = B.resource_address
                  ) C
        ON A.Session_ID = C.SPID
        OUTER APPLY sys.dm_exec_sql_text(sql_handle) D
WHERE   DB_NAME(B.Database_ID) = 'YourDBName' -- Comment out line for all db's
ORDER BY ISNULL(B.cpu_time, A.cpu_time) + ISNULL((B.reads + B.writes), (A.reads + A.writes)) DESC

dbに問題がないことを確認します。

DBCC CHECKDB -- Checks the allocation and structural integrity of all the objects in the specified database.
DBCC UPDATEUSAGE (bybox) -- Reports and corrects pages and row count inaccuracies in the catalog views

ログスペースに注意してください:

DBCC SQLPERF(LOGSPACE)

拡張が進行しているのを見れば、間違いなく速度が低下します。これを実行すると、ログスペースがますます100%に近づくのがわかります。その後、ログが拡大し、パーセンテージはスペースが増えるにつれて縮小します。うまくいけば、バックアップが開始されてログがクリアされるまで、それが拡大することは決してありません。


最初のクエリを実行しても結果が得られません-ほとんどの場合、これらの遅い時間に発生するブロッキングセッションは実際にはないためです...クエリ全体の実行速度が一般的に遅いだけです。私はすべてのDBCCチェックとupdateusagesを実行しましたが、見栄えは良かったです。DBCC SQLPERF(LOGSPACE)に関しては、100%(75%)にさえ近い唯一のDBがモデルであり、大幅に変更されることはないため、ログシップバックアップがログサイズを処理します。
Dave Holland、

-1

ほとんど馬鹿な設定。起こります。

  • 最初に、実際に定期的にインデックスデフラグを定期的に実行する必要があります。バックアップを作成する直前または直後に、アクティビティとしてスケジュールします。

  • 次に、データベースを自動拡張しないでください。特に、自動圧縮しないでください。負荷に応じて、自動拡張/自動圧縮は基本的に自殺設定です。

これほどSQL Serverの速度が低下することはほとんどありません。厳しいストレスのもとで、そのクエリの結果を投稿できますか?その時点でSQL Serverが過負荷になることはありませんか?


最初のポイント:インデックスのデフラグと統計の更新を行う毎週(およびテーブルによっては毎日)メンテナンスジョブがあります。インデックス内の情報をプルバックすると、遅い場合でも、断片化が2〜3%未満になります。2つ目のポイント:自動圧縮は行いません-確かに。これらのデータベースは、絶えず増加しているユーザー情報やサイトコンテンツなどを保持しています(トンではありません...これらは巨大なデータベースではありません)。私はあなたの最後の発言に対処するために私の投稿の最後にいくつかの詳細を追加します。
Dave Holland

3
自動拡張は本当に悪いことではありません。これに依存することはできますが、データベースを最大サイズにするため、データベースへのすべての変更を停止するよりも、有効にする方がはるかに優れています。
Sean Howat

2
パーセンテージによる成長も、通常、良いことではありません。データベースが大きくなると、データベースが最初に起動したときよりも5%増加します。1MBは小さすぎますが、データベースのサイズと使用状況に基づいて、固定のMB増加率を決定する必要があります。
DCNYAM 2010年

1
Autogrowは、小さな増分のログでファイルをクラスター化するため、不適切です。多くの否定的な影響があります。support.microsoft.com/kb/315512ではなく、ファイルを適切なサイズに設定してから、定期的なチェックを実行し、フィルレポートを使用してください。彼らが過成長しないことを確認してください。1mbは考えられる原因かもしれませんが、メンテナンス中に停止/拡張/停止/拡張する必要がある場合は、パフォーマンスを知りたくありません。
TomTom

1
まれにしか発生しない場合、自動拡張は無害です。それが悪くなるのは、それが適切なサイジングの代わりとして使用されるときです。これは、TomTomが 実際に意味していること思います。それ以外の場合は、必ずそれを使用してください。
Maximus Minimus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.