在具有标识列的 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标识列(即自动增长列)

如何控制 SQL Server 中新标识列的分配顺序?

SSIS - SQL Server datetimeoffset目标列,标识为DT_WSTR

Java:如何使用用于 Sql Server 的 java jdbc 执行带有标识列的批量插入

Sql Server 主键 外键约束