在具有标识列的 SQL Server Compact 4.0 表中插入的性能呈指数下降
Posted
技术标签:
【中文标题】在具有标识列的 SQL Server Compact 4.0 表中插入的性能呈指数下降【英文标题】:Exponentially deteriorating performance on inserts in SQL Server Compact 4.0 tables with an Identity column 【发布时间】:2013-02-08 08:20:01 【问题描述】:编辑:以下问题已在 Entity Framework 6 中修复。
运行下面的代码花费了令人失望的 2 分 10 秒。第二次运行它需要 6.5 分钟。这个问题与this one有关
Private Sub RunTest()
Dim sw As New Stopwatch
sw.Restart()
Using db As New TestDB
db.Configuration.AutoDetectChangesEnabled = False
For n = 1 To 100
For m = 1 To 100
db.Tops.Add(New Top)
Next
Next
db.SaveChanges()
End Using
MsgBox(sw.Elapsed.ToString)
End Sub
实体:
Public Class Top
Public Sub New()
MyBase.New()
One = "arerjlwkerjglwejrglwergoiwerhgiowehrowerlwelfvbwlervbowerghpiweurhgpiwuerviiervljwebbrlvjnepvjnweprvupiweurv"
Two = "w;lrjgwwergkjwervgjwelrgjhwelghlwekglwergiuwehrgwjergjwervgjwerjgnwekrngpwergjpowergllwejrnglkwerngpoierhpiiuewrpjwenrwenrv;lwenrvkjernpgpsrvpi"
End Sub
'ID'
Public Property ID As Integer
'NATIVE PROPERTIES'
Public Overridable Property One As String
Public Overridable Property Two As String
'NAVIGATION PROPERTIES'
End Class
在二级交互中移动 Using 块并在那里调用 SaveChanges 只会让情况变得更糟。
TestDB 只是继承 DBContext 而没有任何进一步的配置。当我禁用 Top.ID 属性的数据库生成并自己提供 ID 时,性能提高了 30 倍。这个问题使得在 SQL Server Compact 中使用数据库生成的 ID 成为不可能。除了使用客户端生成的 ID 之外,还有其他解决方案吗?
【问题讨论】:
您是否可以测试这是否也发生在服务器版本的 sql server (express) 中? @GertArnold 是。我会在今天晚些时候通知你。我读到这个问题似乎是特定于 Compact 版本的。 你能分享一个 CREATE TABLE 脚本吗? (由 Sql Compact Toolbox 创建) 将工具箱连接到您的 bin/bebug 文件夹中的 v sdf 文件,并创建脚本 有趣的是,同样的代码使用 ObjectContext 可以在几毫秒内运行——我会尝试进一步挖掘 【参考方案1】:我发现了问题,它是由获取生成的 id 导致表扫描的语句引起的,我在这里提出一个修复,用 4000 个实体测试,从 17 秒下降到 2 秒。 http://entityframework.codeplex.com/workitem/857 - 它将包含在 Alpha 3 之后的 EF6 构建中
【讨论】:
或其他方法被建议,期望它是设计的 - 结果是糟糕的设计 该问题已针对 EF 6 修复。以上是关于在具有标识列的 SQL Server Compact 4.0 表中插入的性能呈指数下降的主要内容,如果未能解决你的问题,请参考以下文章
使用sql语句创建修改SQL Server标识列(即自动增长列)
使用sql语句创建修改SQL Server标识列(即自动增长列)
SSIS - SQL Server datetimeoffset目标列,标识为DT_WSTR