web-dev-qa-db-ja.com

クエリの実行後にSQL Serverがメモリを解放しない

ここで、多くの人が出会ったかもしれない基本的な質問があると思います。 SQL Serverでクエリを実行すると、クエリの実行に必要なすべてのデータがメモリに読み込まれます(たとえば、結合がある場合、これら2つのテーブルから必要なデータが読み込まれます)が、クエリがメモリの実行を完了するとSQL Serverによって消費されたものはリリースされません。

数日前にtempdbスペースを大量に使用するクエリを分析していたため、これに気付きました。クエリの実行に使用すると、(実行の終わりまでに)最大25 GBのRAMが消費されました。この25 GB RAM=は、MSSQLSERVERサービスを再起動しない限り解放されません。

SQL Serverのメモリ管理はどのようにしていますか?これは明らかに問題ですよね?

また、単一のクエリで使用されたメモリをクリアするために何か特別なことをしたかどうかも聞きたいです。

前もって感謝します!

32
Kumar Vaibhav

実際、SQL Serverは、可能な限り多くのRAMを要求するように設計されています。このメモリは、オペレーティングシステムで明示的に必要とされない限り解放されません。最善のアプローチは、サーバーが使用できるRAMの量を制限することであり、これによりOSがno-matter-whatを使用するために一定量のリソースを持つことができると思います。これを設定するには SQL Server Management Studioを使用してメモリオプションを構成する方法

2つのサーバーメモリオプション、min server memoryおよびmax server memoryを使用します、SQL ServerのインスタンスのSQL Serverメモリマネージャーによって管理されるメモリ量(メガバイト単位)を再構成します。

  1. オブジェクトエクスプローラーで、サーバーを右クリックし、プロパティを選択します。
  2. Memoryノードをクリックします。
  3. Server Memory Optionsで、必要な量を入力します最小サーバーメモリおよび最大サーバーメモリ

次のコマンドを使用して、T-SQLでも実行できます(例)。

exec sp_configure 'max server memory', 1024
reconfigure

消費を1GBに制限します。

注:上記は、SQL Serverのすべての側面をそのメモリ量に制限するものではありません。これは、バッファプールと実行プランキャッシュのみを制御します。 CLR、フルテキスト、SQL Server .exeファイルで使用される実際のメモリ、SQLエージェント、拡張ストアドプロシージャなどは、この設定によって制御されません。ただし、これらのその他のものは通常、それほど多くのメモリを必要としません。メモリの大部分を必要とするのはバッファプールと実行プランキャッシュです。

これがお役に立てば幸いです。

27
MoonKnight

私も上記と同じ問題に直面しました。ただし、クエリを実行してRAMメモリを解放しますが、5時間以内にRAMメモリが占​​有されます。したがって、RAMメモリを強制的に解放する必要があります。

EXEC sys.sp_configure N’show advanced options’, N’1' RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N’max server memory (MB)’, N’2048'
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N’show advanced options’, N’0' RECONFIGURE WITH OVERRIDE
GO

次に、次を実行します。

2。

EXEC sys.sp_configure N’show advanced options’, N’1' RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N’max server memory (MB)’, N’6144'
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N’show advanced options’, N’0' RECONFIGURE WITH OVERRIDE
GO
6
Swami

SQL Serverに強制的にメモリを解放させる方法はないと思います。ただし、メモリ使用量を制限できます。

sp_configure 'max server memory', <memory_size MB>
reconfigure

[〜#〜] msdn [〜#〜]

4
Mudassir Hasan

古い質問ですが、私は2セントを追加すると思いました。ほとんどの場合、dsqlを使用してメモリ量を縮小した後、前の値に自動的にロールバックする上記の回答の内容についてのリフです。 ugいですが、動作します。

IF OBJECT_ID(N'tempdb..##globaltemp') IS NOT NULL
BEGIN
    DROP TABLE ##globaltemp
END

SELECT TOP 1 value
INTO ##globaltemp
FROM sys.configurations
WHERE NAME LIKE '%server memory%'
ORDER BY NAME
OPTION (RECOMPILE);

EXEC sys.sp_configure N'max server memory (MB)'
    , N'1024'
GO

RECONFIGURE
WITH OVERRIDE
GO

DECLARE @dsql AS VARCHAR(20)

SELECT @dsql = cast(value AS NVARCHAR(20))
FROM ##globaltemp

EXEC sys.sp_configure N'max server memory (MB)'
    , @dsql
GO

RECONFIGURE
WITH OVERRIDE
GO
1
Jsjjharp