23

我们目前有一个自制的实体框架,它依赖于独立于 DB 的 ORM。

我必须构建一个软件,在数据库中为大约 150 个 excel 模板批量加载元数据(包括单元格位置、单元格类型、格式等信息)。

我可以操作

  • 通过 SQL 批处理(速度更快但交互性更少)

  • 通过在内存中构建对象,使用 LINQ 查询处理它们以进行各种完整性检查,然后将修改提交到数据库

我知道 SQL 绝对更快,但我会知道......它快多少?

详细地说,SQL 查询比 LINQ 查询快多少(假设所有需要的数据都已由 ORM 加载到内存中)

4

2 回答 2

18

TBH 在大多数情况下 linq 或 SQL 并不是问题所在。您的性能将与您插入的数据量、表中当前的数据量以及您维护的索引有关。

其次,您是否需要对数据的多个列进行交叉检查和/或完整性检查。我曾经遇到过添加索引和重建表将插入时间从几分钟缩短到几毫秒的情况,这只是由于碎片错误和缺乏算法。

Linq 是一种为插入和修改逻辑生成 SQL 的有效方法。但是,您总是会得到以下模式:

  1. 从数据库中获取数据
  2. 使用 Linq 修改数据
  3. 提交对数据库的更改。

如果您有任何可以在插入中利用的逻辑,则可以使用集合逻辑在 SQL 中进行更新。例如,更新客户设置 KeyCustomer = 1,其中销售额 > 1000000。SQL Server 将处理这样的命令,比使用 ORM 处理的速度快 1000 倍。然而,正如@gbn 已经正确指出的那样,除非您拥有一支由强大的 SQL 编码员组成的团队,否则维护通常会在短期内胜过任何性能提升。

如果您必须插入大量记录,那么您真的应该通过 SSIS 查看批量加载和/或 ETL。这些 API 将使用更智能的算法并分批执行任何约束检查,而不是每次插入,这将为您带来出色的性能提升。但是管理 SSIS 包比单击应用程序中的按钮要多得多。这些都是您在构建应用程序时需要考虑的设计决策。

于 2012-10-31T10:55:03.503 回答
1

在这里,您可以对各种 ORM 和以下各项进行一些性能比较SqlDataReaderhttp ://code.google.com/p/dapper-dot-net/ (性能部分)。值得一提的是,编译 LINQ 查询可能会显着提高性能: http: //www.codeproject.com/Articles/38174/How-to-improve-your-LINQ-query-performance-by-5-X

于 2012-10-31T10:32:47.683 回答