私は世界中にかなりの数のサーバーを配備しています。彼らは、6 GBのRAMを備えたSQL Server 2005 x64でWindows 2003 x64を実行しています。何年も前にそれらを注文した人は彼が何をしているのか本当に知りませんでしたので、箱は最良の(または許容できる)構成ではありません。
ボックスはかなり一貫してメモリ不足になり、最終的にページングファイルを使用し、すべてが遅くなります。通常、コミットチャージは5.8GBであり、誰かが集中的な何か(たとえば、レポートの実行)を行う必要がある場合、その数は非常に多くなります。
私はより多くのメモリを注文する能力を得ようと努力してきましたが、私は大いに反対しています(たとえば、ソフトウェアのパフォーマンスを向上させる、これらすべてのサーバーのコストが高すぎる、ボックスに十分なメモリがないことを証明するなど)。 ..)。
RAM技術者以外の人にボックスを提示して、最終的に追加のメモリを注文できるようにするために必要な量のガイドライン(または式)はありますか?
それはあなたの使用法とアプリケーションに完全に依存しているので、実際には簡単に言う方法はありません。あなたはデータベースサーバーを使い果たしています...データベースの大きさは?あなたのトランザクション統計は何ですか?
実際の制限はシナリオで明らかです。あなたはしばらくの間6ギグで問題なく走っていますが、それは交換とスラッシングです。したがって、6ギグでは十分ではありません。
パフォーマンスがビジネスに影響を与えるのに十分である場合、上層部は、メモリを増やすことが賢明であるという十分な不満を聞いているはずです。サーバーに追加されたメモリがメモリのコストの問題を30分未満で解決できる可能性がある場合、サーバーの「チューニング」とチューニングのトラブルシューティングにかかる時間を把握します。ダウンタイム。
実際の使用方法で実際にデプロイしてそこから作業するまで、必要なメモリの正確な量はわかりません。
とはいえ、アプリケーションが本当にボトルネックになっていることを確認する必要があるかもしれません。 Windowsパフォーマンスモニターを実行して、ディスクI/O統計とネットワークスループットを確認します。断片化レベルも確認してください( Googleはここで良い友達です )。クエリが非常に非効率的である明らかな問題についても、コードを監査してみることができます( Googleが再び )。
しかし、これはすべて、これがビジネスにどれほど大きな影響を与えているかにかかっています。チューニングに投資する価値はありますか、それとも最初にハードウェアを投入してからチューニングを試すだけでは不十分ですか?
さらに必要があるかどうかを確認する簡単な方法RAMは、Page Life Expectancy perfmonカウンターをグラフ化することです。このカウンターは、SQL Serverが必要になる前にデータがバッファープールに保持されると考える時間を示します他のデータのためのスペースを空けるために。この数をできるだけ高くしたい。RAMの6ギグがインストールされている場合(SQLを最大4ギグで最大に設定する必要がある))おそらく、最大で数分間データをメモリに保持している場合、誰かが大きなレポートを実行すると、この数は数秒に減少します。RAMが多いほど、より長いデータが得られますメモリに保持され、ディスクからの読み取りを少なくする必要があります。
たとえば、現在使用しているシステムの256ギガはRAMで、データを約12000秒ほどメモリに保持します。
ヒットするターゲット数を要求しないでください。できるだけ多くの数が必要です。あなたのシステムについてもっと多くのことを知らなければ、私は撮影に適した数を与えることができません。
うーん。まあ、大きなMSSQLをインストールする場合でも、6ギガはかなりの量のRAMです。実際にコードを調べて確認することをお勧めしますIS=効率的です。6ギガのトランザクションは少し変わっています...私は州全体の給与計算システムで作業しましたが、年末のギグ1099処理...そして1つを実行するには しばしば?知りません。どんな種類のデータを扱っていますか?
とはいえ、64ビットボックスには、RAMを好きなだけ詰め込むことができます。また、ramは汚れが安いので、できるだけ多く入れることができます... RAMデータベースサーバー上に実際にはあまり多くすることはできません。
編集:これは現在非常に古くなっています。 256 GBのRAMを搭載したMSSQLボックスがあります。
より多くのメモリ(またはその他のコンポーネント)を購入する前に、サーバーでパフォーマンス分析を実行することをお勧めします。これは、perfmonを使用して自分で行うことも、サードパーティのツールを使用して確認することもできます。 OSとSQLサーバーの両方のパフォーマンスを分析する必要があります。私見、適切な分析が行われる前に、問題にハードウェアを投入する準備ができていることがよくあります。この時点で知っているすべての人にとって、それはクエリ、ストアドプロシージャ、実行計画、ディスクI/O、CPU使用率などの問題である可能性があります。多くの場合、メモリの負荷はシステムの別のボトルネックの兆候である可能性があります。
データベースサーバーに関しては、「十分な」メモリなどはありません。確かに、それは実際に何をして実行するかに依存しますが、それが大量のデータを含み、複雑なクエリを実行する絶えず利用されるデータベースである場合、6 GBは非常に著しく不適切になる可能性があります。
まず、問題のあるサーバーを32 GBまたは64 GB以上にアップグレードし、それが役立つかどうかを確認します。そうでない場合は、データベースのチューニング、アプリケーションのトラブルシューティング、およびデバッグを使用します。これらはすべて、馬鹿がデータベースを設計していない限り、サーバーグレードのメモリの数スティックよりもはるかにコストがかかります(馬鹿が物を設計していても、明らかな設計を得ることができます)保持されたサポートで修正されたエラーは、かなりの挑戦になる可能性があります).
とはいえ、他の誰かが述べたように、ディスクやネットワークのI/Oパフォーマンスの不足など、(ソフトウェア設計の問題は別として)それを妨げる別の何かである可能性があります。日が役に立つかもしれません。
「Satanicpuppy」が言ったように、RAMが多すぎるということはありませんが、6GBは大丈夫です。おそらく、サーバーの動作を再考する必要があります。「ハードウェア」の問題があるとは思わないので、 SQLプログラミングに集中してください...
より多くのインデックスを作成することを検討する必要があります。一般的に、ほとんどの人はデータベースのインデックスを低くしています。
これはまだエアコードです、まだ完全にはテストしていませんが、正しい方向に進むはずです
http://accessadp.com/2011/08/22/missing-indexes-great-script-for-determining-roi/
Select ‘create index IX_’ +
sys.objects.name +
isnull(replace(‘_’ + equality_columns, ‘,’, ‘_’), ”) +
isnull(replace(‘_’ + inequality_columns, ‘,’, ‘_’), ”) + ‘ on ‘ +
sys.objects.name +
‘(‘ +
coalesce(equality_columns + ‘,’ + inequality_columns, equality_columns , inequality_columns ) +
‘) ‘ +
isnull(‘ include (‘ + included_columns + ‘)’, ”)
as CreateIndexSql,
(CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.user_seeks)+CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.unique_compiles))*CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.avg_total_user_cost)*CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.avg_user_impact/100.0) AS Score,
sys.schemas.schema_id,
sys.schemas.name AS schema_name,
sys.objects.object_id,
sys.objects.name AS object_name,
sys.objects.type,
partitions.Rows, partitions.SizeMB,
sys.dm_db_missing_index_details.equality_columns,
sys.dm_db_missing_index_details.inequality_columns,
sys.dm_db_missing_index_details.included_columns,
sys.dm_db_missing_index_group_stats.unique_compiles,
sys.dm_db_missing_index_group_stats.user_seeks, sys.dm_db_missing_index_group_stats.user_scans,
sys.dm_db_missing_index_group_stats.avg_total_user_cost, sys.dm_db_missing_index_group_stats.avg_user_impact,
sys.dm_db_missing_index_group_stats.last_user_seek, sys.dm_db_missing_index_group_stats.last_user_scan,
sys.dm_db_missing_index_group_stats.system_seeks, sys.dm_db_missing_index_group_stats.system_scans,
sys.dm_db_missing_index_group_stats.avg_total_system_cost, sys.dm_db_missing_index_group_stats.avg_system_impact,
sys.dm_db_missing_index_group_stats.last_system_seek, sys.dm_db_missing_index_group_stats.last_system_scan
FROM
sys.objects
JOIN (
SELECT
object_id, SUM(CASE WHEN index_id BETWEEN 0 AND 1 THEN row_count ELSE 0 END) AS Rows,
CONVERT(numeric(19,3), CONVERT(numeric(19,3), SUM(in_row_reserved_page_count+lob_reserved_page_count+row_overflow_reserved_page_count))/CONVERT(numeric(19,3), 128)) AS SizeMB
FROM sys.dm_db_partition_stats
WHERE sys.dm_db_partition_stats.index_id BETWEEN 0 AND 1 –0=Heap; 1=Clustered; only 1 per table
GROUP BY object_id
) AS partitions ON sys.objects.object_id=partitions.object_id
JOIN sys.schemas ON sys.objects.schema_id=sys.schemas.schema_id
JOIN sys.dm_db_missing_index_details ON sys.objects.object_id=sys.dm_db_missing_index_details.object_id
JOIN sys.dm_db_missing_index_groups ON sys.dm_db_missing_index_details.index_handle=sys.dm_db_missing_index_groups.index_handle
JOIN sys.dm_db_missing_index_group_stats ON sys.dm_db_missing_index_groups.index_group_handle=sys.dm_db_missing_index_group_stats.group_handle
WHERE
sys.dm_db_missing_index_details.database_id=DB_ID()
AND (CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.user_seeks)+CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.unique_compiles))*CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.avg_total_user_cost)*CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.avg_user_impact/100.0) > 100