Использует ли NVARCHAR (MAX) больше памяти (физического размера), чем NVARCHAR (N) - PullRequest
1 голос
/ 25 апреля 2020

На SQL Сервере, если вы создаете столбец типа NVARCHAR(MAX) и заполняете только 128 символов внутри - занимает ли он больше памяти, чем если бы вы создали его как NVARCHAR(128) - или он того же размера

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Хранение может быть таким же. Вам необходимо учесть следующее

  1. MAX будет хранить данные вне строки в распределении больших объектов
  2. Когда вы используете MAX и запускаете запрос, оптимизатор может предоставить ненужную дополнительную память
0 голосов
/ 25 апреля 2020

Я провел небольшой эксперимент, используя следующий код, чтобы создать 2 таблицы и заполнить его одинаково случайными 128 символами:

CREATE TABLE dbo.MyTextFix (
    [val] NVARCHAR(128) NOT NULL
)
CREATE TABLE dbo.MyTextMax (
    [val] NVARCHAR(MAX) NOT NULL
)

SET NOCOUNT ON;
DECLARE @COUNT INT = 0
WHILE (@COUNT <= 100000)
BEGIN
    DECLARE @VAL NVARCHAR(128) = CAST(NEWID() AS NVARCHAR(128)) + '-' + CAST(NEWID() AS NVARCHAR(128)) + '-' + CAST(NEWID() AS NVARCHAR(128)) + '-' + CAST(NEWID() AS NVARCHAR(128))
    INSERT INTO dbo.MyTextFix ([val]) VALUES (@VAL)
    INSERT INTO dbo.MyTextMax ([val]) VALUES (@VAL)
    SET @COUNT = @COUNT + 1
END

А теперь - мы будем использовать «Использование диска по таблицам», чтобы проверьте фактический размер таблиц:

enter image description here

Как видите, хотя одна таблица имеет NVARCHAR(128), а другая - NVARCHAR(MAX) типы данных - если мы заполняем только 128 символов - обе таблицы имеют одинаковый размер.

...