Nat*_*ate 33 sql-server entity-framework sql-server-2008-r2 azure-sql-database
我有一些使用 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; }
Run Code Online (Sandbox Code Playgroud)
我希望根据名称、来源、生成和书面内容进行查询和/或排序。我希望 Name 和 Source 的长度为 0-50 个字符,有时可达 150 个。我希望这个表开始时很小(<100k 行),但随着时间的推移显着增长(>1m 行)。显然消息可以是小或大的,并且可能不会被查询。
我想知道的是,我的 Name 和 Source 列被定义为nvarchar(max)当我从不期望它们大于 150 个字符时是否会影响性能?
Con*_*lls 27
较大的 nvarchar (max) 数据项(超过 8000 字节左右)将溢出到文本存储中并需要额外的 I/O。较小的项目将存储在行中。有一些选项可以控制此行为 -有关更多详细信息,请参阅此MSDN 文章。
如果存储在行中,则没有显着的 I/O 性能开销;处理数据类型可能会有额外的 CPU 开销,但这可能很小。
但是,将 nvarchar (max) 列留在数据库周围不需要它们的地方是相当糟糕的形式。它确实有一些性能开销,并且通常数据大小对于理解数据表非常有帮助——例如,一个 50 或 100 个字符宽的 varchar 列可能是一个描述或一个自由文本字段,其中一个(比如)10- 20 个字符的 ling 很可能是一个代码。您会惊讶于人们经常需要通过这样的假设从数据库中推断出多少意义。
在数据仓库中工作,通常不是在支持或记录不佳的遗留系统上工作,拥有一个易于理解的数据库模式是非常有价值的。如果您将数据库视为应用程序的遗产,请尝试对将要从您那里继承它的人友好一些。
小智 23
尽管这不能回答您的具体问题,但它可能首先使您无需提出问题:可以在 C# 模型类中设置字符串变量的长度,这将导致实体框架生成 SQL使用固定长度的 nvarchar 类型(例如nvarchar(50)),而不是nvarchar(max).
例如,而不是:
public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)
您可以使用:
[StringLength(50)]
public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)
如果需要,您还可以强制使用类型varchar代替nvarchar,如下所示:
[Column(TypeName = "VARCHAR")]
[StringLength(50)]
public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)
来源:https : //stackoverflow.com/questions/7341783/entity-framework-data-annotations-set-stringlength-varchar/7341920
HLG*_*GEM 10
索引最大的问题。来自 BOL:
列,其大对象(LOB)的数据类型
ntext,text,varchar(max),nvarchar(max),varbinary(max),xml,或image不能被指定为索引键列。
如果你不能正确索引,你的查询就会很慢。从数据完整性的角度来看,nvarchar(max)与指定限制相比,拥有将允许在字段中放入更多的不良数据。
小智 9
是的,映射string到的默认 EF 行为nvarchar(max)不好。在 EF 6 中,您可以添加自己的自定义约定以使用您自己的首选默认映射覆盖此行为。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Properties<string>()
.Configure(s => s.HasMaxLength(200).HasColumnType("varchar") );
base.OnModelCreating(modelBuilder);
}
Run Code Online (Sandbox Code Playgroud)
OnModelCreating如上所述覆盖会将所有字符串的默认映射更改为varchar(200).
| 归档时间: |
|
| 查看次数: |
70217 次 |
| 最近记录: |