任何为高速批量插入提供体面方法的 ORM?

Posted

技术标签:

【中文标题】任何为高速批量插入提供体面方法的 ORM?【英文标题】:Any ORMs which provide decent methods for high speed bulk inserts? 【发布时间】:2011-06-28 18:59:47 【问题描述】:

是否有任何 ORM 为高速批量插入提供了不错的方法?

我问的原因是 Entity 框架非常适合提取数据,但如果您希望插入速度超过每秒 10 行,则完全失败。

更新

我目前使用 DataTable 和 T-SQL 以每秒 80,000 行的速度插入,但如果我可以全面使用 ORM 会更简洁。

【问题讨论】:

行/秒不是有用的度量,因为您没有指定它们的宽度。我可以说我的车可以“每小时 1,000,000 个长度单位”,这在不知道长度单位有多长的情况下是没有意义的。 每行有 25 列。大多数表的列数不超过 30 列。我发现行/秒测量值是相同的,无论我插入的行是 5 列还是 25 列。 【参考方案1】:

恐怕您会发现 ORM 在每秒执行 80K 行时是一个糟糕的选择。只是无法完成,除非您绕过 Linq 到 T-SQL 的转换并直接针对数据库。但是这样你就违背了 ORM 的目的。即使那样,我也很难看到您将如何达到每秒 80K 行(尽管您没有定义每行的宽度)。

像 EF 和 Linq to SQL 这样的 ORM 将在每次更新时发出一个插入语句。这不利于 80K/秒的吞吐率。 IMO,您应该使用像 SSIS 这样的批量插入工具。这就是它的设计目的。

【讨论】:

如果它们是相当简单的批量插入,那么可以创建一个存储过程,一次说 50 个,并将其连接到 EF 中,这将提高性能。但除此之外,你是完全正确的,这并不是完成这项工作的最佳工具。【参考方案2】:

Blimey,4 年前问过?

嗯……

如果有人仍然在这里寻找答案,Jon Wagner 的 Insight.Database(一个非常漂亮的 Micro-ORM)支持 SQL BULK INSERT。

我可以使用以下语法轻松地每秒写入 200,000 行 -

Database.Connection().BulkCopy("TableName", myListOfItemsToInsert);

这对你有用吗?

Insight.Database on GitHub

【讨论】:

【参考方案3】:

您可以使用 EF 进行后门,但反对使用 ORM 的常见论据之一是性能。

ORM 旨在提高可读性/可编码性/并减少开发时间。如果您关心性能,请使用本机 sql。

【讨论】:

这不是对 ORM 本身的限制,而是对大多数现有 ORM 的限制。要在应用程序代码中使用“本机 SQL”,您需要介于两者之间,例如 ADO.Net 或高性能 ORM。【参考方案4】:

不,这不是 ORM 的用途。 ORM 支持OLTP,不支持批量数据处理。为工作使用正确的工具。

(如果您坚持使用 ORM,请查看为插入设置批量大小。)

【讨论】:

谢谢,我不知道 ORM 最初是为类似 OLTP 的环境设计的。 这在原则上是不正确的。 “对象-关系映射是一种编程技术,用于使用面向对象的编程语言在不兼容的类型系统之间转换数据。”定义没有暗示使用限制,只有实现。 en.wikipedia.org/wiki/Object%E2%80%93relational_mapping【参考方案5】:

现在有可以实现非常接近此性能的完整 ORM,例如 Nfinity.Data (https://www.nfinity.software),它将在大约 2 秒内插入 80,000 行。我刚刚测试了一个大约 5 列宽的表,包括各种数据类型。

Windows 10、i7 CPU、32 GB RAM、SQL Server 2017、.Net Core 3.1

【讨论】:

以上是关于任何为高速批量插入提供体面方法的 ORM?的主要内容,如果未能解决你的问题,请参考以下文章

增加批量插入方法

python ORM允许创建表和批量插入?

mysql数据库批量高速插入

PHP框架 Laravel Eloquent ORM 批量插入数据,怎么实现

如何为批量插入配置spring boot和data jpa

Spring Data JPA HIbernate 批量插入速度较慢