我想将n条记录插入到单个表中.可能有许多并发用户,他们可能会从此表中插入/更新/选择数据.在这样的表中插入更好的方法是1000条记录:
>将单个SQL查询发送到具有多个插入的数据库.这会将服务器保存到数据库调用,但是(我不确定)会锁定表,直到插入完成并且对该表的所有其他查询将等待.
>在一些块中划分1000条记录,并在多个SQL查询中发送它们.这允许在表上执行其他查询,但是花费时间在服务器上进行数据库调用.
这取决于某些东西,还是只有一种始终是最佳的方式?
这是否取决于是否使用交易,同时插入数据?
是否有其他更好的方法来执行此类插入?
解决方法
这完全取决于您使用的RDBMS.
在Oracle中,写入从不阻止读取,这就是为什么您可以安全地将数据全部放在一起.但请注意,这会降低性能,因为并发查询需要从UNDO表空间中获取需要额外读取的数据.
在sql Server写入中,对受影响的行/页/表执行阻止读取(取决于锁升级问题),除非将TRANSACTION ISOLATION LEVEL设置为SNAPSHOT.
在允许并发写入和读取的所有事务引擎中,引擎需要在某处存储旧数据和新数据,以便同时可用.
在Oracle中,旧数据被复制到UNDO表空间.
在sql Server中,它被复制到tempdb中(仅当启用了SNAPSHOT隔离时,否则它只是被锁定).
这总是需要一些资源(内存或磁盘),如果UPDATE查询影响很多行,则可能会耗尽这些资源.