Я проверяю способность переменных таблицы 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