代码之家  ›  专栏  ›  技术社区  ›  Kamarey

SQL插入查询性能

  •  6
  • Kamarey  · 技术社区  · 15 年前

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

    1. 将单个SQL查询发送到具有多个插入的数据库。这会将服务器保存到数据库调用,但(我不确定)会锁定表,直到插入完成,对该表的所有其他查询都将等待。
    2. 将1000条记录分成若干块,然后在多个SQL查询中发送它们。这使得其他查询可以在表上执行,但需要花费时间在服务器到数据库的调用上。

    这取决于什么,还是只有一种方法始终是最佳的? 这是否取决于在插入数据时是否使用事务? 有没有其他更好的方法来执行这样的插入?

    我使用的数据库是MS SQL,但它在其他数据库(如Oracle)中的工作方式很有趣。

    4 回复  |  直到 15 年前
        1
  •  6
  •   Quassnoi    15 年前

    这完全取决于 RDBMS 你在用。

    Oracle ,写入从不阻塞读取,这就是为什么您可以安全地同时放置所有数据的原因。但是请注意,这会降低性能,因为并发查询需要从 UNDO 需要额外读取的表空间。

    SQL Server 除非设置了 TRANSACTION ISOLATION LEVEL SNAPSHOT .

    在所有允许并发写入和读取的事务引擎中,该引擎需要将旧数据和新数据存储在某个地方,以便同时使用。

    甲骨文公司 ,将旧数据复制到 撤消 表空间。

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

    这总是需要一些资源(内存或磁盘),如果 UPDATE 查询影响很多行。

        2
  •  2
  •   RichardOD    15 年前

    我在博客上写过这个 a while ago -我想这篇文章回答了你的一些问题。如果你担心读者会阻止作家,CK的建议是合理的(Quassnoi也是如此——他对甲骨文有一些好观点)。

        3
  •  2
  •   Matijs    15 年前

    一般的规则是,您应该让数据库了解如何完成这项工作。在一个语句中,你告诉它做的越多,这就越有效,也就是说,你应该一次插入1000条记录。这对 数据库服务器和大多数服务器不会阻止读写。

    也有例外:如果插入速度慢是因为服务器速度慢,或者表太大或太复杂 可以 最好将查询拆分为一组小的插入。

    中间方法是在一个大脚本中为10或100行发送多个插入命令,并在其间提交到服务器。

    补充: 大多数数据库服务器不会像Oracle、IBM DB/2和MySQL中那样使用InnoDB表阻止读取。另一方面,SQL Server甚至可以为读取而锁定表,但不在其中。

        4
  •  1
  •   cjk    15 年前

    设置一个允许在事务期间读取旧数据的隔离(并发)级别-例如,SQL Server 2005+具有读取快照。