SQL INSERT查询性能(Sql insert query performance)

2019-06-27 03:36发布

我想插入n条记录到一个表。 可能有许多并发用户,他们可以从该表中插入/更新/选择数据。 什么是在这样的表中插入说1000条记录更好的办法:

  1. 发送单个SQL查询与多个插入数据库。 这样可以节省服务器数据库调用,但直到插入完成后,所有其他查询该表将等待(我不知道)锁定表。
  2. 1000个除以记录一些数据块,并在多个SQL查询发送。 这让被放在桌子上执行的其他查询,而是把时间花在服务器数据库调用。

这是要看的东西,或者有,始终是最优的一个方法是什么? 这是取决于交易是否使用与否,而插入数据? 是否有其他更好的方法来执行这样的插入?

我使用的数据库是MS SQL,但它是如何工作的其他数据库如Oracle也同样吸引。

Answer 1:

这完全取决于什么RDBMS所使用。

Oracle ,写从未块读取,这就是为什么你可以放心地把你的数据的一次。 但是请注意,这会降低性能,因为并发查询需要将数据取出来的UNDO表空间,这将需要额外的读取。

SQL Server写做块上受影响的行/页/表(根据锁升级问题)读取,除非您设置TRANSACTION ISOLATION LEVELSNAPSHOT

在所有事务引擎,允许并发写入和读取,发动机需要同时存储新旧数据的地方它可在同一时间进行。

Oracle ,旧的数据被复制到UNDO表空间。

SQL Server ,它就会被复制到tempdb (仅当SNAPSHOT启用隔离,否则它只是锁定)。

这总是需要一些资源(内存或磁盘),并且可以运行这些资源,如果你的UPDATE查询会影响大量的行。



Answer 2:

我的博客上讲述这个前一阵子 -我觉得后回答大家的一些问题。 CK的建议是声音(所以是Quassnoi-他有关甲骨文公司的一些好点),如果你担心读者阻止作家。



Answer 3:

一般的规则是,你应该让数据库弄清楚如何做的工作。 这工作得更好越多,你告诉它在一个语句来完成,即你应该一气呵成插入1000条记录。 这将最适合大多数数据库服务器和大多数服务器不会阻止读取写入。

当然也有例外:如果插入速度很慢,因为服务器速度慢或表或大或复杂的, 可能是更好的查询拆分成小刀片组。

在一间方法将发送多个INSERT命令在一个大的脚本服务器说,在在10个或100行与提交。

补充:大多数数据库服务器不会阻止阅读作为Oracle,IBM DB / 2和MySQL使用InnoDB表。 在另一方面SQL Server管理锁定表甚至读取和不在其中。



Answer 4:

设置隔离(并发)水平,使交易过程中的旧数据的读取 - 例如,SQL服务器已经2005+读快照。



文章来源: Sql insert query performance