微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

EF Code First 对所有字符串使用 nvarchar(max)这会损害查询性能吗?

如何解决EF Code First 对所有字符串使用 nvarchar(max)这会损害查询性能吗?

较大的 nvarchar (max) 数据项(超过 8000 字节左右)将溢出到文本存储中并需要额外的 I/O。较小的物品将按行存放。有一些选项可以控制此行为 -有关详细信息,请参阅此MSDN 文章

如果存储在行中,则没有显着的 I/O 性能开销;处理数据类型可能会有额外的 cpu 开销,但这可能很小。

但是,将 nvarchar (max) 列留在数据库周围不需要它们的地方是相当糟糕的形式。它确实有一些性能开销,并且通常数据大小对于理解数据表非常有帮助 - 例如,一个 50 或 100 个字符宽的 varchar 列可能是一个描述或一个自由文本字段,其中一个(比如说)10- 20 chars ling 很可能是一个代码。您会惊讶地发现,人们经常需要通过这样的假设从数据库中推断出多少意义。

在数据仓库中工作,通常不是在缺乏支持或文档记录的遗留系统上工作,拥有一个易于理解的数据库模式是非常有价值的。如果您将数据库视为应用程序的遗产,请尽量善待将要从您那里继承它的人。

解决方法

我有一些使用 Entity Framework Code First 创建的数据库;这些应用程序正在运行,总的来说,我对 Code First 让我做的事情感到非常满意。我首先是程序员,其次是 DBA,这是必要的。我正在阅读 DataAttributes 以进一步用 C# 描述我希望数据库做什么;我的问题是:在我的桌子上放这些字符串会吃什么惩罚nvarchar(max)(见下面的例子)?

此特定表中有几列;在 C# 中,它们被定义为:

[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public string Name { get; set; }
public string Message { get; set; }
public string Source { get; set; }
public DateTime Generated { get; set; }
public DateTime Written { get; set; }

我希望根据 Name、Source、Generated 和 Written 进行查询和/或排序。我希望 Name 和 Source 的字符长度为 0-50,偶尔可达 150。我希望这个表开始时非常小(<100k 行),但随着时间的推移会显着增长(>1m 行)。显然消息可能很小或很大,并且可能不会被查询。

我想知道的是,我的 Name 和 Source 列被定义为nvarchar(max)我从不期望它们大于 150 个字符时是否会影响性能?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。