使用较大的内存表变量时,“资源池'default'中的系统内存不足,无法运行此查询”

时间:2019-04-03 21:43:54

标签: sql-server in-memory table-valued-parameters table-variable

我正在测试内存表变量的功能,并设置以下测试。然后我收到了这样的错误消息:

  

该语句已终止。
  信息701,第17级,州立103,第80行
  资源池“默认”中没有足够的系统内存来运行此查询。
  **在执行批处理期间遇到错误。继续。

该错误随机发生。当我将较小的数字放入内存中的表变量中时,有时会出现错误,而有时批处理会顺利进行。顺便说一句,我正在使用SQL Server 2016开发人员版,因此永远不会有内存限制。实际上,我认为发生此错误时,我的计算机至少还剩4 GB RAM。

我对“资源库”不熟悉,有人可以向我解释为什么会这样吗?以及如何避免出现此问题,或者如何知道内存表变量的边缘限制?

PS:不确定此信息是否有帮助,但是我检查了perfmon并发现在大多数情况下,IOPagePool64K Total Allocated下降到1,而IOPagePool64K Free List Count的值为0,当我收到错误消息时。因此,如果我必须在某个时间段内猜测分配的内存以某种方式被释放或清理?即使它稍后会分配给它,但是在释放它时,分配的内存将不足,因为分配的内存为0?有人可以确认吗?预先谢谢你!

CREATE TYPE dbo.GEN_UDT_INT_mem 
AS TABLE
         (
           Id INT NOT NULL index i1 NONCLUSTERED(Id)
         ) 
WITH
( MEMORY_OPTIMIZED = ON
);  
GO


CREATE PROCEDURE dbo.ASelectFunctionUsingTVP 
(
  @Filter dbo.GEN_UDT_INT_mem READONLY
, @Result INT OUTPUT
)
AS
BEGIN

  SELECT @Result = t.Id
    FROM            dbo.TABLEA  t
         INNER JOIN @Filter     f ON t.Id= f.Id;
END;
GO

DECLARE @Vmem dbo.GEN_UDT_INT_mem 
      , @rst  INT;

INSERT INTO @Vmem
SELECT Id
  FROM #Temp -- Contain 510000 records

EXEC dbo.ASelectFunctionUsingTVP @Vmem, @rst OUTPUT;


GO 1000

0 个答案:

没有答案