RAMの増加、パフォーマンスの低下


9

セットアップ:

  • Windows Server 2008 R2
  • SQL Server 2008 R2 SP1
  • 240GB RAM
  • TempDBは自動拡張なしの8x16GBデータファイル(合計128GB)
  • 物理/スタンドアロンサーバー

このサーバーは、ETL処理に使用されます。このサーバーに追加のRAMを追加しただけで、合計で240GBのRAMになります。SQL Serverサービスのみが実行されています。

メモリは、BIOS、OpenManage、およびWindowsで正常に表示されます。

70 / 100GBのメモリの最小/最大を使用するようにSQL Serverを構成した場合、問題はありません。ただし、それを120 / 150GBに増やすと、ETLプロセスの1つを実行すると次のエラーが発生します。

'PRIMARY'ファイルグループがいっぱいのため、データベース 'tempdb'のオブジェクト '<temporary system object:422234507706368>'に領域を割り当てることができませんでした 不要なファイルを削除するか、ファイルグループ内のオブジェクトを削除するか、ファイルグループにファイルを追加するか、ファイルグループ内の既存のファイルに対して自動拡張をオンに設定して、ディスク領域を作成します。(メッセージ1105、状態2、手順不明、行1)

メモリ構成を変更する前に、この問題に遭遇したことはありません。元の70 / 100GBに再構成した後、このエラーは発生しません。

私が試したこと:

  1. TempDBデータファイルを自動拡張に設定します。これにより、ディスク容量に達するまでファイルが自動拡張され、失敗するだけです。
  2. TempDBデータファイルをさらに追加します。示されているのと同じエラー。
  3. TempDBのサイズを8x32GB(合計256GB)に増やします。

この問題の原因は何なのか途方に暮れています。


2
NUMAノード間でメモリのバランスが取れていますか?あなたのプロセッサはどうですか?SQL Serverログには、起動時に使用されているCPUの数が表示されますか?
アーロンバートランド

1
ETLプロセスに何を使用していますか?SSISまたは同様のツール?SQL Serverの外部のツールである場合、SQL Serverインスタンスと同じサーバーで実行していますか?
Mike Fal 2013年

1
これは@Mikeの良い点です。SQLServerが使用しすぎているためにETLプロセスが十分なメモリを取得できない場合は、tempdbに処理をプッシュする必要があるかもしれません。
アーロンバートランド

1
tempdbの使用状況を監視するための良い手始めは次のとおりです。msdn.microsoft.com / en-us / library / ms176029(v=SQL.105).aspx。これにより、何が起こっているかがわかります。
Thomas Stringer 2013年

2
TempDBが実際に拡張しているときに、実際に何が実行されているかについて分析を行いましたか?単純なsp_who2 / sp_whoisactive?よく管理されているがわかりにくいトランザクションが長時間実行されているように思えます。個人的には、メモリの変更に接続することはできませんが、まずコードを見て、それが適切に実行されているかどうかを確認します。
Mike Fal 2013年

回答:


3

皆さんの助けに感謝します。

いくつかの実行プランを注いだ後、利用可能なRAMの容量に基づいて異なる方法で処理されているJOINがあることがわかりました。RAMが少ないと、ハッシュで評価されます。RAMが増えると、一連のマージ結合が使用されます。

つまり、基本的には、私が現在リファクタリングしている、不十分に記述されたT-SQLが原因でした。


4
ハッシュ結合はメモリの付与を必要とするのに対し、マージは必要としないため、これはかなり直観に反しています。マージ結合をサポートする追加のソート操作はありますか?
マーティン・スミス

1

これは質問に対する回答ではなく、コメントに投稿したくないコードの一部です。NUMAノード全体のスケジューラとメモリのバランスを確認するには(また、オンラインで表示されていないノードがないか確認するには):

SELECT 
  parent_node_id, 
  [status],
  AVG(current_tasks_count) AS avg_tasks_count, 
  AVG(load_factor) AS avg_load_factor,
  scheduler_count = COUNT(*)
FROM sys.dm_os_schedulers
GROUP BY parent_node_id, [status];

SELECT 
  memory_node_id, 
  name, 
  SUM(single_pages_kb + multi_pages_kb) AS memory_kb
FROM sys.dm_os_memory_clerks
GROUP BY memory_node_id, name;

(SQL Server 2012では、個別のシングルページアロケーターとマルチページアロケーターがなくなったため、最後にしてSUMくださいSUM(pages_kb)。)

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