【问题标题】:Does NVARCHAR(MAX) consume more storage (physical size) than NVARCHAR(N)NVARCHAR(MAX) 是否比 NVARCHAR(N) 消耗更多的存储空间(物理大小)
【发布时间】:2020-04-25 17:19:12
【问题描述】:

在 SQL Server 中,如果您创建一个类型为 NVARCHAR(MAX) 的列,并且在其中仅填充 128 个字符 - 与创建为 NVARCHAR(128) 相比,它会消耗更多的存储空间 - 还是它的大小相同?

【问题讨论】:

  • 行内存储时,空间不变。如果由于行/页中的其他列而需要在行外存储,则 MAX 类型将更多。除了存储之外,请考虑 SQL Server 可能需要为查询计划中的 MAX 类型考虑内存,因此除非您需要超过 4000 个字符,否则不要使用 varchar(MAX)。
  • 为了补充@DanGuzman 的评论,我将列数据类型宽度视为一种约束。如果您正在编写的应用程序预计不超过(在您的示例中)128 个字符,请将其设为 nvarchar(128),无论 nvarchar(max) 是否会将这些相同的字符存储在等量的存储空间中。

标签: sql-server database tsql size nvarchar


【解决方案1】:

我做了一个小实验,使用下面的代码创建 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

现在 - 我们将使用“表的磁盘使用情况”来检查表的实际大小:

如您所见,即使一个表具有 NVARCHAR(128) 而另一个具有 NVARCHAR(MAX) 数据类型 - 如果我们只填充 128 个字符 - 两个表的大小相同。

【讨论】:

    【解决方案2】:

    存储可能相同。您需要考虑以下事项

    1. MAX 将数据存储在 LOB 分配中的行外
    2. 当您使用 MAX 并运行查询时,优化器可能会授予不必要的更多内存

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      相关资源
      最近更新 更多