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

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

我有一些使用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行).显然,消息可能很小或很大,并且可能不会被查询. 我想知道的是,当我从未期望它们大于150个字符时,我的Name和Source列的性能是否被定义为nvarchar(max)?

解决方法

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

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

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

在数据仓库中工作,通常不在支持不良或文档化的遗留系统上,拥有易于理解的数据库模式非常有价值.如果您将数据库视为应用程序的遗留问题,请尝试对将要从您继承数据库的人员表示满意.

原文地址:https://www.jb51.cc/mssql/80448.html

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

相关推荐