【发布时间】:2011-02-27 13:39:38
【问题描述】:
我有一个简单的导入器,它遍历一个相当大的 csv 的每一行并将其导入数据库。
我的问题是:我应该调用另一个方法来插入每个对象(生成一个 DO 并告诉它的映射器插入)还是应该在导入方法中硬编码插入过程,复制代码?
我知道调用第二种方法是优雅的做法,但我一直在脑海中听到函数调用很昂贵。
你怎么看?
【问题讨论】:
我有一个简单的导入器,它遍历一个相当大的 csv 的每一行并将其导入数据库。
我的问题是:我应该调用另一个方法来插入每个对象(生成一个 DO 并告诉它的映射器插入)还是应该在导入方法中硬编码插入过程,复制代码?
我知道调用第二种方法是优雅的做法,但我一直在脑海中听到函数调用很昂贵。
你怎么看?
【问题讨论】:
这应该没关系,因为插入所需的时间可能比 php 代码长几个数量级。
正如其他人所说,批量插入将为您带来更多好处。 那些行级优化只会让你对好的更高级别的优化视而不见。
如果您不确定,请用两种方式做一个简单的计时,找出时间不会超过几分钟。
如果一次性达到一些内存/时间/....限制,请考虑将这两种方法结合起来进行批量插入。
【讨论】:
许多 RDBMS 品牌都支持执行批量导入的特殊命令。例如:
LOAD DATA INFILE
COPY
BULK INSERT
SQL*Loader
使用这些命令优于一次从 CSV 数据源插入一行,因为批量加载命令的运行速度通常至少快一个数量级。
【讨论】:
我认为这并不重要。考虑批量插入。至少确保您正在使用事务,并考虑在插入之前禁用索引。
【讨论】: