gpt4 book ai didi

sql-server - Sql Server行大小限制和表设计

转载 作者:行者123 更新时间:2023-12-04 02:09:20 28 4
gpt4 key购买 nike

我在 SQL Server 2008 上有这个查询

CREATE TABLE MediaLibrary
(
MediaId bigint NOT NULL IDENTITY (1, 1),
MediaTypeId smallint NOT NULL,
ImageNameByUser nchar(100) NULL,
GeneratedName uniqueidentifier NOT NULL,
UploadedByUserId uniqueidentifier NOT NULL,
UploadedDate date NOT NULL,
ProfilePhoto bit NOT NULL,
PublicPhoto bit NOT NULL,
AppointmentId bigint NULL,
OriginalImage nchar(1000) NULL,
ThumbImage nchar(1000) NULL,
MediumImage nchar(1000) NULL,
LargeImage nchar(1000) NULL,
UrlThumb nchar(1000) NULL,
UrlMedium nchar(1000) NULL,
UrlLarge nchar(1000) NULL,
InactiveReasonId smallint NULL,
InactiveDate datetime NULL
) ON [PRIMARY]
GO

当我尝试创建表时出现此错误

Creating or altering table 'MediaLibrary' failed because the minimum row size would be 14273, including 9 bytes of internal overhead. This exceeds the maximum allowable table row size of 8060 bytes.

我知道我达到了行大小的限制,但这不是一张大表,所以我想知道这是否不是一个好的设计?

当我将 nchar(1000) 更改为 varChar(1000) 时,表格保存良好。我担心的是,一旦数据实际保存到表中,我将再次达到行大小限制。

最佳答案

假设您不打算填充所有列,您需要使用 nvarchar(或只是 varchar)而不是 nchar(或 char)。原因是 nchar(1000) 需要保留 2000 字节,无论您是否要使用它。这不适用于 varchar/nvarchar。

现在,如果您打算在这些列中的每一列中包含 1000 个字符,那么无论您使用何种数据类型,它都无法正常工作。原因是 SQL Server 中的基本存储元素是 8K 页。因此,不可能存储超过 ~8K 的行(根据列中的数据类型,有一些页眉开销以及可能使用的其他位)。解决方法通常是:

  • varchar(max) - 它可以将不适合行外的数据存储为 blob,但这样做会产生性能开销,并且会引入一些限制,例如执行在线重建的能力
  • 更改表结构,以便将这些 URL 作为单独的行存储在单独的表中。示例:

    CREATE TABLE dbo.Media
    (
    MediaID BIGINT IDENTITY(1,1) PRIMARY KEY,
    MediaTypeID SMALLINT NOT NULL,
    ImageNameByUser NVARCHAR(100) NULL, -- should also not be nchar
    GeneratedName UNIQUEIDENTIFIER NOT NULL,
    UploadedByUserId UNIQUEIDENTIFIER NOT NULL,
    UploadedDate date NOT NULL,
    ProfilePhoto bit NOT NULL,
    PublicPhoto bit NOT NULL,
    AppointmentId bigint NULL,
    InactiveReasonId smallint NULL,
    InactiveDate datetime NULL
    );

    CREATE TABLE dbo.URLTypes
    (
    URLTypeID TINYINT NOT NULL PRIMARY KEY,
    Description NVARCHAR(32) NOT NULL UNIQUE
    );

    INSERT dbo.URLTypes VALUES(1,'OriginalImage'),(2,'ThumbImage'),...;

    CREATE TABLE dbo.MediaURLs
    (
    MediaID BIGINT NOT NULL FOREIGN KEY REFERENCES dbo.Media(MediaID),
    URLTypeID TINYINT NOT NULL FOREIGN KEY REFERENCES dbo.URLTypes(URLTypeID),
    URL VARCHAR(2048) NOT NULL
    );

顺便说一句,您真的需要为 URL 支持 Unicode 吗?

关于sql-server - Sql Server行大小限制和表设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20219607/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com