Когда переменная объявляется в хранимой процедуре T-SQL, она сохраняется в памяти или в базе данных tempdb? - PullRequest
8 голосов
/ 16 марта 2012

Мы пытаемся оптимизировать некоторые из наших хранимых процедур T-SQL, чтобы уменьшить конкуренцию с tempdb, но я не могу понять, как переменные, не включенные в таблицу, хранятся на сервере SQL:

  • А как насчет простых типов данных, таких как INT и DATETIME? Такое ощущение, что они живут в памяти.
  • А как насчет VARCHAR / VARCHAR (MAX)? Обычный VARCHAR может жить в памяти, но VARCHAR (MAX) может потребоваться использовать базу данных tempdb.
  • Табличные переменные хранятся в базе данных tempdb. Это меня не особо интересует.

В статье MSDN о tempdb не объясняются обычные переменные.

Ответы [ 2 ]

10 голосов
/ 16 марта 2012

Статья планирования мощности для базы данных tempdb отвечает на ваши вопросы:

Типы данных больших объектов: varchar (max), nvarchar (max), varbinary (max) text, ntext, image и xml. Эти типы могут быть до 2 ГБ в размере и может использоваться в качестве переменных или параметров в хранимых процедуры, пользовательские функции, пакеты или запросы. параметры и переменные, которые определены как тип данных LOB, используют основную память как хранение, если значения малы. Тем не менее, большие значения хранятся в Tempdb. Когда переменные и параметры LOB хранятся в базе данных tempdb, они рассматриваются как внутренние объекты. Вы можете запросить Представление динамического управления sys.dm_db_session_space_usage для отчета страницы, выделенные внутренним объектам для данного сеанса.

Эта статья заслуживает прочтения в полном объеме, поскольку она также охватывает множество других применений для базы данных tempdb.

РЕДАКТИРОВАТЬ: Если вам интересно, сколько памяти в базе данных tempdb использует конкретный сеанс, вы можете выполнить следующий запрос:

select * 
from sys.dm_db_session_space_usage 
where session_id = @@SPID

Используя это, выглядело, как будто моя VARCHAR(MAX) переменная не хранилась в базе данных tempdb до тех пор, пока не достигла размера около 1000 КБ ... но я уверен, что это зависит от объема памяти, доступной вашему серверу.

1 голос
/ 31 марта 2019

" Переменные таблицы хранятся в базе данных tempdb. Хотя это меня не особо интересует."

В общем, да, переменные таблицы хранятся в базе данных tempdb, но это можно изменитьс оптимизированными для памяти табличными переменными.

Более быстрая временная таблица и табличная переменная с помощью оптимизации памяти

D.Сценарий: переменная таблицы может быть MEMORY_OPTIMIZED = ON

Традиционная переменная таблицы представляет таблицу в базе данных tempdb.Для более быстрой производительности вы можете оптимизировать память вашей табличной переменной.

Встроенный синтаксис не поддерживает оптимизацию памяти.Поэтому давайте преобразуем встроенный синтаксис в явный синтаксис для TYPE.

CREATE TYPE dbo.typeTableD AS TABLE  
(  
    Column1  INT   NOT NULL INDEX ix1,  
    Column2  CHAR(10)  
) WITH (MEMORY_OPTIMIZED = ON);

DECLARE @tvTableD dbo.typeTableD;
INSERT INTO @tvTableD (Column1) values (1), (2);  

SELECT * FROM @tbTableD;

Переменная таблицы, оптимизированная для памяти, не находится в базе данных tempdb.Оптимизация памяти приводит к увеличению скорости, которое часто в 10 и более раз быстрее.

...