我们目前有一个自制的实体框架,它依赖于独立于数据库的ORM。
我需要构建一个软件,将大约150个Excel模板的元数据批量加载到数据库中(包括有关单元格位置、单元格类型、格式等信息)。
我可以通过以下方式进行操作:
通过SQL批处理(速度更快但交互性较差)
通过在内存中构建对象,使用LINQ查询进行各种完整性检查,然后提交修改到数据库
我知道SQL绝对更快,但我想知道...它有多快?
具体来说,假设ORM已经将所有所需数据加载到内存中,SQL查询比LINQ查询快多少?
我们目前有一个自制的实体框架,它依赖于独立于数据库的ORM。
我需要构建一个软件,将大约150个Excel模板的元数据批量加载到数据库中(包括有关单元格位置、单元格类型、格式等信息)。
我可以通过以下方式进行操作:
通过SQL批处理(速度更快但交互性较差)
通过在内存中构建对象,使用LINQ查询进行各种完整性检查,然后提交修改到数据库
我知道SQL绝对更快,但我想知道...它有多快?
具体来说,假设ORM已经将所有所需数据加载到内存中,SQL查询比LINQ查询快多少?
在大多数情况下,linq或SQL并不是问题的关键。您的性能将与您插入的数据量、当前表中的数据量以及您正在维护的索引相关。
其次,您是否需要在数据的多个列之间进行交叉检查和/或完整性检查。我遇到过这样的情况:添加索引并重建表格仅由于糟糕的碎片化和缺乏算法,插入时间从几分钟降至毫秒。
Linq是生成插入和修改逻辑的SQL的有效方法。但是,您总会得到以下模式:
如果您在插入中有任何逻辑可以利用,则可以使用集合逻辑来执行SQL中的更新。例如:Update Customers Set KeyCustomer = 1 where Sales > 1000000. SQL Server将处理此类命令比ORM快上千倍。然而,正如@gbn已经正确指出的那样,除非您拥有一支强大的SQL编码团队,在短期内维护通常会胜过任何性能增益。
如果您必须插入大量记录,则确实应该考虑通过SSIS进行批量加载和/或ETL。这些API将使用更智能的算法,并按批次执行任何约束检查而不是每个插入,这将为您带来出色的性能提升。但是管理SSIS包比在应用程序中点击按钮要繁重得多。这些都是您在设计应用程序时需要考虑的设计决策。
这里有一些ORM和SqlDataReader
之间的性能比较:http://code.google.com/p/dapper-dot-net/(性能部分)。值得一提的是,编译LINQ查询可能会显著提高性能:http://www.codeproject.com/Articles/38174/How-to-improve-your-LINQ-query-performance-by-5-X