gpt4 book ai didi

sql - 我应该使用 nvarchar(max) 代替 nvarchar(64) 列还是作为附加列?

转载 作者:行者123 更新时间:2023-12-03 02:50:54 26 4
gpt4 key购买 nike

我正在构建一个表来跟踪数据库中特定对象的历史记录。目前我有以下列:

HistoryId int IDENTITY(1,1) NOT NULL
HistoryDate datetimeoffset(7) NOT NULL
HistoryTypeId int NOT NULL
HistoryDetails nvarchar(max) NULL

在大多数情况下,每个历史记录项都通过 HistoryTypeId 进行 self 解释,因此 HistoryDe​​tails 要么为 Null,要么非常小。但对于一些历史类型,详细数据将会很大。是否可以对所有记录使用 nvarchar(max),还是应该将其分开并为需要超过 64 个字符的历史记录类型添加一个额外的列(见下文)?粗略估计,80%-90%的记录不需要超过64个字符的详细信息,表中将有数百万条记录。

HistoryId int IDENTITY(1,1) NOT NULL
HistoryDate datetimeoffset(7) NOT NULL
HistoryTypeId int NOT NULL
HistoryDetails nvarchar(64) NULL
HistoryDetailsMore nvarchar(max) NULL

最佳答案

您不能使 NVARCHAR(MAX) 成为普通 B-Tree 索引中键的一部分(您仍然可以将其用作索引中包含的列) .

否则,只要列中的数据不超过行大小阈值,存储就会相同。

由于您可能不会为该字段建立索引,因此最好将其创建为 NVARCHAR(MAX)

即使您仍然想对其建立索引(例如,使用 LIKE 进行前缀搜索),您也可以创建一个计算 NVARCHAR(450) 列,创建一个索引在该列上,并将其添加到您的查询中以进行粗略过滤。

请参阅我的博客中的此条目了解更多详细信息:

如果您只想对小列进行精确搜索,请创建一个计算列,为其建立索引并进行如下查询:

ALTER TABLE History ADD HistoryDetailsIndex AS SUBSTRING(HistoryDetails, 1, 50)

CREATE INDEX ix_mytable_typeid_details ON History (HistoryTypeId, HistoryDetailsIndex) INCLUDE (HistoryDetails)

SELECT COUNT(*)
FROM History
WHERE HistoryTypeId = 123
AND HistoryDetailsIndex LIKE 'string_prefix_up_to_50_characters%'
AND HistoryDetails = 'string_prefix_up_to_50_characters_plus_everything_after_it'

这只会将 HistoryDe​​tails 中的前 50 个字符包含到索引键中(将在 LIKE 条件下进行搜索) ,以及所有内容都包含在包含的列中。

如果您绝对确定永远不会搜索长度超过 50 个字符的字符串,则可以省略包含的列并仅使用以下内容:

SELECT  COUNT(*)
FROM History
WHERE HistoryTypeId = 123
AND HistoryDetailsIndex = 'string_prefix_up_to_50_characters'

这将使索引更短。

但是,如果您提供的字符串长度超过 50 个字符,则此操作将会失败,因此,如果您绝对确定永远不会搜索长字符串,请使用它。

关于sql - 我应该使用 nvarchar(max) 代替 nvarchar(64) 列还是作为附加列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1422246/

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