34

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

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

皆さんは SQL Server のメモリ管理をどのように行っていますか? これは明らかに問題ですよね?

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

前もって感謝します!

4

5 に答える 5

6

私も上記と同じ問題に直面しました。ただし、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
于 2014-05-28T06:20:01.273 に答える
1

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

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
于 2016-04-18T15:32:07.323 に答える
-2

SQL は高レベルの宣言型言語です。C などの低レベルのプログラミング言語でコードを記述している場合のように、メモリ管理などの詳細に関与できるようにすることは意図されていません。メモリを解放する必要がある場合は、別のタスクのために、すぐに手放します。

于 2013-06-25T07:23:56.643 に答える