どちらを信頼しますか?


8

ベンダーとの長期にわたる問題のトラブルシューティングを行っています。彼らのソフトウェアはフリーズして、週に1〜2回作業を停止する傾向があり、私たちの操作に大きな混乱を引き起こしています。多くのGBのログとDBのバックアップを送信しても、原因を特定できませんでした。最近、彼らは問題が私たちのメンテナンスに関するものであり、おそらくソフトウェアに関するものではないことを示唆し始めています(問題が発生したときに長時間実行されているクエリ、CPU / RAM / IOプレッシャー、またはデッドロックさえないにもかかわらず)。特に彼らは私たちのインデックスが問題であると言っています。

彼らが使用するのにお気に入りのツールはDBCC showcontigですが、これはMSによって廃止されると主張しています。彼らは特にスキャン密度と範囲の断片化にこだわっています。言い訳を取り除くために、<90%のスキャン密度または> 10%の断片化でインデックスを再構築する積極的な夜間メンテナンスを行いました。これにより、スキャン密度トレインからそれらをある程度放棄しましたが、エクステントの断片化に固定されたままです。DBCC showcontigは、数時間前に再構築されたインデックスでも、高度な断片化を示します。以下は、「可能性のある問題」として指摘されたテーブルのdbcc_showcontigおよびsys.dm_db_index_physical_statsの結果です。

DBCC SHOWCONTIG
  • スキャンしたページ................................:1222108
  • スキャンされた範囲..............................:152964
  • エクステントスイッチ..............................:180904
  • 平均 エクステントごとのページ..................................:8.0
  • スキャン密度[ベストカウント:実際のカウント] .......:84.44%[152764:180905]
  • 論理スキャンの断片化..................:3.24%
  • エクステントスキャンの断片化...................:35.97%
  • 平均 ページあたりの空きバイト..................................:692.5
  • 平均 ページ密度(フル).....................:91.44%

sys.dm_db_index_physical_stats

index_type_desc      alloc_unit_type_desc     Avg_fragmentation_in_percent  page_count

CLUSTERED INDEX       IN_ROW_DATA          3.236803129  1222070

NONCLUSTERED INDEX    IN_ROW_DATA          0.680074642  48230

NONCLUSTERED INDEX    IN_ROW_DATA          0.093237195  48264

NONCLUSTERED INDEX    IN_ROW_DATA          0.03315856   48253

NONCLUSTERED INDEX    IN_ROW_DATA          0.194653248  48291

NONCLUSTERED INDEX    IN_ROW_DATA          0.393480436  58961

NONCLUSTERED INDEX    IN_ROW_DATA          0.23622292   64346

NONCLUSTERED INDEX    IN_ROW_DATA          0.041445623  48256

NONCLUSTERED INDEX    IN_ROW_DATA          0.701172007  59044

NONCLUSTERED INDEX    IN_ROW_DATA          0.216397724  53605

インデックスを気にする必要がありますか?上記のものは非定型ではありません。推奨されるMS DMVはそれが問題ないことを示しているように見えますが、ベンダーはその35.97%のエクステントの断片化に行き詰まっています。これは彼らがソフトウェアの問題のせいにするために必死に何かを見つけようとしているだけだと思う​​が、私が実際の問題を抱えているなら、私はそれを試して修正したい。


15
エクステントの断片化が原因でクエリがフリーズし、動作が停止することはありません。この問題が発生している場合は、ベンダーにダフをやめてSQL Serverで実際に何が起こっているのかを分析するように指示する必要があります-ブロックの確認、待機統計の確認など。エクステントの断片化を非難するのは、私が自動車事故を非難するようなものです昨日お昼に食べたバナナに。
アーロンバートランド

私が最初に疑問を持つのは、問題が発生しているときにあなたが見ている待機は何ですか。私はこれが環境で実行されているすべてのクエリの問題(あなたの質問に基づく)であると想定しています。これは、大量のRAMとCPU(> 16GB、> 16CPU)が搭載されたマシンでワークロードを実行しているときに、数人の顧客に見られました。実行しているハードウェア構成、表示されている待機、およびSQL Serverのバージョンに関心があります
Amit Banerjee

1
pluralsight.com/courses/sqlserver-supporting-isv-applicationsを聞くことをお勧めします。また、Brent Ozarからsp_blitzを実行して、物事を壊すことなくシステムに追加できる推奨事項のリストを確認してみてください。
Henrik Staun Poulsen、2015

断片化についての執着を止めて実際に診断を開始するためのベンダーへの簡単な返答は次のとおりです。「断片化は常に存在します。それがこの問題の根本的な原因である場合、それは一日中起こります。それは明らかに起こっていないので一日中、それが問題になることはありませんか?」
Swears-a-lotロット

回答:


1

彼らのソフトウェアはフリーズして、週に1〜2回作業を停止する傾向があり、私たちの操作に大きな混乱を引き起こしています。多くのGBのログとDBのバックアップを送信しても、原因を特定できませんでした。...特に、彼らは私たちのインデックスが問題であると言っています。

ああ、そうか、このジョークは聞いたことがあると思う。それは次のようなものではありませんか?

アヒルがバーに入る そして、「痛い!」 (冗談です;-)そしてバーテンダーは、「何がありますか?」

アヒルは、「最強のウォッカの3本の指をギミ」と言います。

バーテンダーは、まるで冗談を言っているかのように、「3羽のことを言っているのではないか」と言っています。

アヒルは言った、「ほら、あなたはもうエブリバディラブズレイモンドのヘッドライターではなくなってすみませんが、今日は辛い日だったので、友達になってウォッカで作れますか?」

バーテンダーは「確かに、相棒。ちょっと待って」と言います。

彼はしばらくして戻ってきて、去ったときより明らかに少し幸せではなく、アヒルに言った、「私たちは皆、良いものを使い果たしているようです。残っているのはSkyyだけです。それでうまくいきますか?」

アヒルはカウンターの上にジャンプし、バーテンダーを片方の翼で(どういうわけか)襟でつかんで、もう一方の翼のどこかからナイフを引き出します。 。カット。あなた。」

パニック状態のバーテンダーは、「ねえ、データベースです。遅いです。応答していません」と言います。

アヒル、彼がバーテンダーをただここで終わらせるべきかどうかについて少し混乱している-今ここで-「データベース?一体何について話しているの?」

バーテンダーはすすり泣き、ぼやけてしまいます。「わかりません...ブロックされているのですか?..それは私たちが言うことだけです...インデックスまたは何かを再構築してみてください。他に何を言ったらよいかわからない...サーバーにメモリを追加する必要があるかもしれません...助けになると思いますか?...アプリのコードが高速で、データベースがボトルネックであることを誰もが知っています。ねえ、私は<air-quotes> web-scale </ air-quotes>で通常はオープンソースであり、無料で、TwitterやGoogleなどのNoSQLデータベースについて聞いていました。リレーショナルデータベースはほぼ廃止されているため、Facebookはすべてこれを使用しています。」

そしてそれで、アヒルは彼の決心をした...........

うーん。まあ、私を信じてください、それは元のハンガリー語でとてもおかしいです。

しかし、それでも、システムが遅くなったときに、それがデータベースであると見なすために、なぜ多くの人々が最初に反応したのでしょうか。アプリのコードをひどく書くことができない、または単にいくつかのバグがあるのか​​?遅くなるのは確かにデータベースでしょう。しかし、単純にロック/フリーズしますか?これはデータベース固有の問題ではありません。

これ、外部リソース(ネットワークソケット、ファイルシステムハンドルなど)を適切に解放していないアプリコードの可能性があります。.NETアプリケーションについて話している場合、開発者は、Dispose()アンマネージリソースに関連付けられているオブジェクトを適切に削除することを忘れることがあります。例:SqlConnectionオブジェクトを開く。あなたはそれらの無限の量を取得しません。したがって、データベースを調べたい場合は問題ありません。ただし、次にシステムがフリーズしたときに、次のことを簡単に確認してください。

SELECT sdec.*, '---' AS [---], sdes.*
FROM sys.dm_exec_connections sdec
INNER JOIN sys.dm_exec_sessions sdes
        ON sdes.session_id = sdec.session_id

それらのコードが接続を解放していない場合は、接続が多すぎるかどうか、特にそれらの多くが長いアイドル時間を持っている場合は、かなり明白です。

そして、おそらくこれはすでにチェックされており、質問では明らかにされていません。しかし、それらがインデックスと断片化に非常に集中しているというのは、かなり奇妙な印象を受けます。確かに、パラメーターのスニッフィングの問題がありストアドプロシージャが1つ、またはいくつかのストアドプロシージャにかなりの時間を要しますが、アプリケーション全体がロックされますか?特に、実行中のクエリが表示されず、大量のリソースやロック、またはこれが発生したときに時間を費やしていない場合は、購入しません。

それで、「どちらを信頼するか」。確かにこのベンダーではありません;-)。


-1

インデックスを再編成または再構築する必要があるかどうかを確認するには、次のクエリを使用します。

declare @strBD nvarchar(50)

set @strBD = N'Tu_BD';

select table = OBJECT_NAME(object_id, database_id)
    ,index = index_id
    ,Index_Type = index_type_desc
    ,Logic_Frag = avg_fragmentation_in_percent
    ,Action = case 
        when avg_fragmentation_in_percent < 30.0
            then 'ALTER INDEX REORGANIZE'
        else 'ALTER INDEX REBUILD WITH (ONLINE = ON)'
        end
from sys.dm_db_index_physical_stats(DB_ID(@strBD), null, null, null, 'LIMITED');

交換してください@strBDyour database name

結果に応じて、https://msdn.microsoft.com/en-us/library/ms189858(v = sql.110).aspxに記載されている手順に従ってください。このリンクはSQL Serverの2012バージョン用です。正しく続行するには、適切なバージョンを選択してください。

誰かがコメントしたように、「フラグメンテーションの問題」を超えて、レビューと修正をベンダーに伝える方が良いです。おそらく、SQLプロファイラキャプチャでいくつかのクエリと実行プランを識別します。


identifying some queries and execution plans with a SQL Profiler capture.ああ.. .. exec plansプロファイラーでキャプチャしないでください。それはあなたのサーバーを屈服させることができます。代わりに、DMVデータを調べます。
Kin Shah
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.