«Недостаточно системной памяти в пуле ресурсов« по умолчанию »для выполнения этого запроса» ОШИБКА при использовании большой табличной переменной в памяти - PullRequest
0 голосов
/ 04 апреля 2019

Я проверяю способность переменных таблицы In-memory и настраиваю тест ниже. Тогда у меня есть сообщение об ошибке, подобное этому:

Заявление прекращено.
Сообщение 701, уровень 17, состояние 103, строка 80
Недостаточно системной памяти в пуле ресурсов «по умолчанию» для выполнения этого запроса.
** Произошла ошибка во время выполнения пакета. Продолжение.

Ошибка происходит немного случайно. Когда я помещаю меньшее число в переменную таблицы в памяти, иногда появляется ошибка, в других случаях пакеты проходили гладко. Кстати, я использую SQL Server 2016 для разработчиков, поэтому не должно быть никаких ограничений памяти. И на самом деле, я думаю, что на моем компьютере осталось по крайней мере 4 ГБ ОЗУ, когда произошла эта ошибка

Я не знаком с "пулом ресурсов", может кто-нибудь объяснить мне, почему это происходит? И как я могу избежать этой проблемы или, может быть, знать предел границы переменных таблицы в памяти?

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...