2008より遅いSQL Server 2012


15

古いサーバー(Windows 2008 / SQL Server 2008/16 GB RAM / 2 x 2.5 GHzクアッドコア/ SASディスク)から大規模なWebサイトとデータベースを、より優れた新しいサーバー(Windows 2008 R2 / SQL Server 2012 SP1 / 64 GB RAM / 2 x 2.1 GHz 16コアプロセッサ/ SSDディスク)。

古いサーバーのデータベースファイルをデタッチし、新しいサーバーにコピーして添付しました。すべてがうまくいきました。

その後、互換性レベルを110に変更し、統計を更新し、インデックスを再構築しました。

残念ながら、新しいSQL 2012サーバーでは、ほとんどのSQLクエリが古いSQL 2008サーバーよりもはるかに遅い(2-3-4倍遅い)ことに気付きました。

たとえば、約70万件のレコードがあるテーブルでは、古いサーバーではインデックスのクエリに約100ミリ秒かかりました。新しいサーバーでは、同じクエリに約350ミリ秒かかります。

すべてのクエリで同じことが起こります。

ここで助けていただければ幸いです。チェック/検証する内容を教えてください。新しいSQL Serverを搭載した優れたサーバーではパフォーマンスが低下すると信じるのは非常に難しいためです。

詳細:

メモリは最大に設定されています。

私はこのテーブルとインデックスを持っています:

CREATE TABLE [dbo].[Answer_Details_23](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [UserID] [int] NOT NULL,
    [SurveyID] [int] NOT NULL,
    [CustomerID] [int] NOT NULL default 0,
    [SummaryID] [int] NOT NULL,
    [QuestionID] [int] NOT NULL,
    [RowID] [int] NOT NULL default 0,
    [OptionID] [int] NOT NULL default 0,
    [EnteredText] [ntext] NULL,
 CONSTRAINT [Answer_Details_23_PK] PRIMARY KEY NONCLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

CREATE NONCLUSTERED INDEX [IDX_Answer_Details_23_SummaryID_QuestionID] ON [dbo].[Answer_Details_23]
(
    [SummaryID] ASC,
    [QuestionID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

私はこのクエリを実行しました:

set statistics time on;
select summaryid, count(summaryid) from Answer_Details_23 group by summaryid order by count(summaryid) desc;
set statistics time off;

古いサーバー-SQL Serverの実行時間:CPU時間= 419ミリ秒、経過時間= 695ミリ秒。

新しいサーバー-SQL Serverの実行時間:CPU時間= 1340ミリ秒、経過時間= 1636ミリ秒。

ここにアップロードされた実行計画:http ://we.tl/ARbPuvf9t8

後の更新:

  • AMD 2.1GHz Opteron 16コアプロセッサは、Intel 2.5GHzクアッドコアプロセッサよりもひどく見えます
  • Windowsの電源オプションをバランサードからハイパワーに変更する大幅な改善
  • 最大並列度を8に、コストしきい値を4に変更してさらに改善

現在、SQL Serverの実行時間:CPU時間= 550ミリ秒、経過時間= 828ミリ秒。

まだ古いサーバーよりも悪いですが、それほど悪くはありません。他の提案(ローカルクエリの最適化以外)がある場合は、お気軽にコメントしてください。


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
ポールホワイトモニカーを復活

回答:


8

SQL Serverでも同様の問題が発生しました。サーバーが最適に構成されていない可能性があります。新しいXeonにはTurboBoost、HTなどが付属しており、サーバーのパフォーマンスに大きな影響を与える可能性があります。

たとえば、成功しました。 Dellサーバーの低遅延構成

設定は、Dell以外のサーバーに適用されますが、名前が異なる場合があります。

また、Windowsの電源管理プロファイルをBalancedから高性能に設定することにより、パフォーマンスを改善しました。最後の部分は、x64サーバー上のOS用に最大8GBのメモリを予約することをお勧めします。デフォルトのSQLインストールはすべてのメモリを使用します。最大SQL Serverのメモリ構成を合計メモリよりも4 / 8GB少なく設定して、4 / 8GBの予約を試してください。

可能であれば、古いサーバーに戻すことをお勧めします。回帰/自動化/ロードスクリプトを使用できない場合は、アクティビティが多い期間にシステムアクティビティを1〜4時間記録するのが最善です。次に、本番と同じWebサーバーと、スクリプトを実行するクライアントマシンをセットアップします。新しいサーバーに対して同じアクティビティを実行し、構成を変更して、同じアクティビティを再度実行します。本当にもっともっとやりたいと思うでしょうが、それが実行可能であるとは思われず、この質問の範囲外です。


サーバーの負荷はそれほど高くありません。SQL Serverは通常、20〜35 GBのメモリにあります。いつでも16 GBを超える空きメモリがありました。また、プロセッサは通常10〜15%の使用量を渡しません。
prog_sr08

2
これまでで最大の改善は、Windowsの電力管理をバランスの取れた電力から高電力に設定することによって達成されました。それは本当にプロセッサの問題のように見えます。SQL Serverの実行時間:CPU時間= 892ミリ秒、経過時間= 874ミリ秒。
prog_sr08

8

チェック/検証する内容を教えてください

パフォーマンスに問題があります。待機やキューなどのパフォーマンストラブルシューティング方法に従って、ボトルネックを特定します。リンクされた方法論は、何をどのように測定するかを示します。調査結果をここに投稿してください。実際の測定値に基づいて具体的なアドバイスを提供できます。あまりにもオープンであり、誰もが推測しているように。特定の問題に絞り込むと、当て推量がなくなります。

更新後

計画はまったく異なります。古いプランでは、実際にカーディナリティの推定値が悪い(141k対108k)スタック上のストリーム集合体が低く、ハッシュ計算でさらに予測ミスがあり、逆の方法(35k対108k)でした。新しいプランにはストリームの集計がなく、最上位まで正確な推定値があります。もちろん、これは古い計画がより速く実行された理由を説明しません。

ボトムスキャンの行番号はわずかに異なります(重要ではありません)が、コストはまったく異なります。古いものは2.49884(IO 2.28979 CPU 0.20905)対新しい1.59109(IO 1.53868 CPU 0.0524084)です。繰り返しますが、2012年のより良い実行を指します(インデックスの再構築により、おそらく断片化が減少しましたか?)

まったく異なるのは、スレッドの数です。新しい32(それぞれ〜23k行を取得)と8つの古い(それぞれ〜95k行を取得)。テーブルはかなり狭いです。キャッシュが頻繁に無効になるため、多数のスレッドが実際にパフォーマンスを低下させている可能性があります。私が試してみます:

  1. 新しいサーバー構成(もしあれば)のハイパースレッディングを排除する
  2. DOP 8でクエリを試してください。

あなたのコメントに気づいた:

maxdop 8で実行計画を追加しました。実際には、クエリはこのように高速です。

おそらく、CPUがお互いの足指を踏んでいるだけでしょう。SSDが適切​​に配置されている場合、IOはおそらくほとんどないため、テーブルは明らかに32のスキャナーを保証するには小さすぎます。その交換スワップは、おそらくL1 / L2を常に無効にします。


1
2012年のすべては2008年よりはるかに遅くなります。ここではクエリを最適化しようとはしていません。この新しいサーバーでまったく同じデータベースを使用して、少なくとも同じパフォーマンスが得られれば幸いです。
-prog_sr08

1
待機とキューは、クエリの最適化に関するものではありません。ボトルネックを特定することです。
レムスルサヌ

ドキュメントをダウンロードしました。とても面白そうです。私は今それをやっていますが、しばらく時間がかかるようです。最初に見る場所を提案できますか?
prog_sr08

1
統計を待つ。、その後、2008年から2012年の間の違いを比較し、両方に5〜10分間のロードを実行し、2008年から2012年の両方にそれらをリセット
レムスRusanu

新しいサーバーはライブサイト/データベースをホストしているため、現在2つのサーバー間で統計を比較することはできません。古いサーバーには、負荷がかからなくなったデータベースが残りました。
prog_sr08

3

最新のマルチコアシステム、特にマルチCPUシステムの場合、ハードウェアアーキテクチャは、メモリの特定の部分が特定のコア/プロセッサから遠く、メモリの特定の部分が特定のコア/プロセッサに近いというものです。これは、Non-Uniform Memory Architecture(略してNUMA)と呼ばれます。MAXDOPの設定をNUMAノードごとのコアの数と一致させて、特定のnumaノードがデータ用に独自のメモリの外に出なければならない回数を最小限にしたい場合。

以下を使用して新しいマシンの構成を確認し、MAXDOPがハードウェアに関して最適な設定に設定されていることを確認できます。

DECLARE @CPUs int;
DECLARE @NumaNodes int;
DECLARE @ServerRAMInMB int;

SET @ServerRAMinMB = (SELECT (i.physical_memory_kb / 1024) AS ServerMemory 
    FROM sys.dm_os_sys_info i);
SET @CPUs = (SELECT i.cpu_count from sys.dm_os_sys_info i);
SET @NumaNodes = (SELECT MAX(c.memory_node_id) + 1 FROM sys.dm_os_memory_clerks c 
    WHERE memory_node_id < 64);

SELECT @ServerRamInMB, @CPUs, @NumaNodes;

IF @CPUs > 4 /* this would be 4 cores, not 4 CPUs */
BEGIN
    DECLARE @MaxDOP int;
    SET @MaxDOP = @CPUs * 0.75;
    IF @MaxDOP > (@CPUs / @NumaNodes) SET @MaxDOP = (@CPUs / @NumaNodes);
    EXEC sp_configure 'max degree of parallelism', @MaxDOP;
    EXEC sp_configure 'cost threshold for parallelism', 4; 
END

指定したサーバーに適切な値に設定オプションと構成オプションを@ServerRamInMB設定するために使用するため、ここにパラメーターを含めました。Max Server MemoryMin Server Memory


1
64 GBのRAM、32のプロセッサコア、4つのnumaノードがあります。最大並列度を8に設定し、コストしきい値を4に設定します。この設定で、電源オプションを高電力に設定すると、SQL Server実行時間:CPU時間= 550ミリ秒、経過時間= 828ミリ秒。
prog_sr08

それで、それは勝利ですか?それがあなたのために働くのを見てうれしいです!
マックスヴァーノン

0

現在使用しているエディションとライセンスモードは何ですか?おそらくすべてのコアを使用しているわけではありません。このページのメモを参照してください-http://msdn.microsoft.com/en-us/library/ms143760.aspx

「サーバー+クライアントアクセスライセンス(CAL)ベースのライセンスを使用するEnterprise Editionは、SQL Serverインスタンスごとに最大20コアに制限されています。」


2
これは、彼が以前にCALを持っていて祖父になった場合にのみ当てはまります。それでも、20コアしかない場合でも、パフォーマンスは以前のシステム(8のみ)よりも著しく低下することはありません。
アーロンバートランド

Web Editionを使用しています(4ソケットまたは16コアのうちの小さい方に制限されています)。古いサーバーでは、とにかく8コアしかありませんでした。
prog_sr08

0

このページで説明した問題と同じ問題がありました。「バランス」から「高性能」に電力設定を切り替えると劇的な違いが生じ、応答時間が2倍以上になりました。現在、SSDを使用しているため、エネルギー消費が問題であるとは思いません。


-2

また、ある問題を他の問題と混同するのではなく、堅牢な解決策なしで少なくとも2週間この問題を経験しました。

最後に次のように解像度:-

  1. 互換性を010から011にリセットしました

  2. masterデータベースの互換性もリセットします。デフォルトでは、sqlは古い互換性設定を保持します。手動で変更する必要があること。

ではごきげんよう

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.