`
woshixushigang
  • 浏览: 578515 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

批量插入数据效率问题

阅读更多

大家都知道,招聘系统有用户投递简历的操作,用户可以选择多条职位信息进行投递。显然对存简历id和公司发布信息id的中间表操作时非常频繁的,如何优化效率是关键。

 

细节一:同时插入多行记录时,宜采用一条Insert语句

  在数据插入时,往往需要同时往一个表中插入多条数据。如以ERP系统的采购订单为例。用户在前台客户端录入采购订单时,有可能需要向同一个供应商同时采购多个原材料。此时在数据库中,就需要往一个表格中同时插入多条记录。在插入数据时,可以通过两个方式实现。一是采用多条Insert语句,每个Insert语句插入一条记录。另外一种方式是只采用一条Insert语句,插入多条语句。采取这两种方式,有什么差异呢?

  从语言编写的角度看,第一种方式比较清楚明了。但是从数据插入速度的角度来看,第二种方式性能比较好。特别是一次性插入一两百条记录时,两者所需要的时间会相差一倍以上。如下图所示,就是使用一条Insert语句插入多条记录的举例。

  总之在数据插入时,需要注意使用带有多个值列表的Insert语句一次插入多行记录要比使用一个单行插入语句快很多。而且随着行数的增加,这个差异会越来越大。在数据库设计时,如果有设计到同时插入多条数据的纪录,如通过客户端导入基础数据、通过前置单据自动生成相关单据,这些作业都会遇到向某个表中一次性插入多条记录的情况。此时从提高数据库性能的角度考虑,笔者建议采用一个Insert语句同时插入多条记录的方式。虽然说编写语言的时候会增加复杂程度,但是这点投资与数据库性能优化相比而言,是值得的。

  细节二:批量插入记录时,建立采用Load Date Infile语句

  有时候可能需要往Mysql数据库中批量导入数据。如在ERP系统初始化过程中,需要将产品数据导入到系统中。实施顾问一般会要求用户根据他们的格式准备好相关的数据,然后利用导入作业,将这些数据一次性导入到数据库中。虽然这个导入作业是通过前台客户端来完成的,但是最终仍然是反映在数据库中。

  针对这种批量数据的导入,数据库又提供了两种方式。一是上面所介绍的,采用一个Insert语句插入多行记录的方式;另外一种就是采用Load Date Infile的方式。这两种方式有什么差异呢?Load Date Infile顾名思义,就是从一个文件中导入数据。为此如果采用这种方式的话,用户需要预先准备一个固定格式的文件。而Insert语句的话,没有这个要求,其可以直接利用其他作业中获得的数据。从这个角度讲,如果插入的纪录数比较少(如在一百条左右)或者通过系统交互来获得数据,此时比较适合使用Insert语句。从性能的角度考虑,通常情况下使用Load Date Infile语句的方式插入数据要比使用Insert语句速度快10到20倍。为此如果插入的数据量比较多,如期初导入数据时可能会有超过上万条的记录,此时使用Load Date Infile的方式能够取得比较好的性能。

 

 

细节三:插入延迟,提高插入操作对系统的不利影响

  在某些情况下,用户对插入数据的即时性要求可能并不是很高,此时就可以考虑通过插入延迟特性,来减少插入操作对系统资源的耗用。笔者再以ERP系统为例。在ERP系统中,有一个安全库存管理的作业。如果启用了这个作业的话,那么系统会在每天一个固定的时刻,分析账上的库存数据与安全库存之间的关系。如果发现库存数量低于安全库存时,系统就会自动生成一张请购单,将差异的数据插入到后台的数据库表中。显然,对于这些记录,用户并不需要等待数据的插入完成。如在前台调用这个作业时,可以将这个作业放在后端执行。等到执行完毕后,再通知用户即可。

  在遇到这种情况时,就可以使用插入延迟的功能。当数据库工程师启用插入延迟功能时,服务器会立刻返回,而不会在那边等着数据插入完成。如果表中没有被其他线程所调用的情况,那么记录会排队等待被插入。使用这个插入延迟特性,还能够带来另外一个好处。当多个作业同时往同一个表中插入数据的时候,这些进程会被记录在同一个Block中。这就好像将多个单独的Insert语句合并成一条Insert语句来执行,其速度会快许多。

  细节四:在插入大量数据之前,可以先将表锁定

  在数据库库中,某些表只有特定的用户才使用。而且每次使用时可能会同时插入多条数据。如在ERP系统中导入期初数据时,就会碰到这种情况。从前台客户端导入产品数据时,通常情况下中间会有一个过渡表。用户可以通过这个过渡表来核对数据是否准确。如果没有问题的话,再将其导入到产品信息表中。采取这种方式,用户还可以查询到有哪些记录没有被导入到系统中。

  由于期初数据的导入,一般是有系统管理员来完成的。此时这张过渡表只有一个用户使用。为了提高数据插入的效率,数据库工程师可以考虑,在插入之前先将表锁定。这可以提高数据插入的性能。这主要是因为索引缓冲区只是在所有的插入语句完成之后才对磁盘进行一次性刷新。也就是说,有多个插入语句就会有多少次索引缓冲区刷新。为此在数据插入之前,将数据表进行锁定,就可以大幅度的提高数据插入的效率。

  细节五:插入数据之前先对数据进行排序

  众所周知,在对记录进行排序时,需要耗费一定的系统资源。如果在插入数据时,就能够考虑到排序问题,那么在后续记录查询时,就可以避免重新排序所造成的二次开销。故笔者建议,在可行的情况下,在对数据插入之前先对记录根据一定的规则进行排序。

  如在采购订单行表中,同时插入多条语句(从物料申购单转换为采购订单)。在采购订单行中插入多条记录之前,可以根据用户的使用习惯,如按照产品的编号进行排序。用户在后续查询时,就可以直接使用查询的结果(默认情况下是根据记录插入的先后顺序来显示结果的)。显示时就不需要再进行一次排序作业,从而可以提高数据后续查询的效率。

  上面笔者提到的这个些内容,其实都是插入作业中的一些细节问题。但是这些细节内容,对于提高数据库的插入效率有很大的帮助。有时候单纯的通过提高硬件配置来改善数据库的性能,还不能够提到这么明显的效果。

分享到:
评论

相关推荐

    ACCESS和SQL批量插入数据工具

    这款工具专为数据库管理员和开发人员设计,用于快速、高效地向ACCESS和SQL Server数据库中批量插入数据,尤其在进行负荷测试时,它能显著提高工作效率。 首先,我们来了解一下ACCESS。ACCESS是Microsoft Office套件...

    Delphi批量插入数据库数据..rar

    批量插入数据是数据库操作中的常见需求,尤其是在处理大量数据时,为了提高效率和减少网络往返,通常会采用这种方式。在Delphi中,我们可以使用不同的方法来实现这个功能,如使用SQL语句、ADO(ActiveX Data Objects...

    C# 批量插入数据方式

    在C#编程中,批量插入数据是数据库操作中常见的需求,尤其在处理大量数据时,为了提高效率,避免频繁的数据库交互,批量插入是必不可少的技巧。本篇将详细讲解如何在C#中实现批量插入数据,以及涉及的相关知识点。 ...

    C# Oracle批量插入数据进度条的实现代码

    考虑到当Excel数据量较大时,循环Insert语句效率太低,故采用批量插入的方法。在插入操作运行时,会造成系统短暂的“卡死”现象。为了让用户知道插入的状态,需要制作一个进度条来显示插入的进度。 批量插入 项目中...

    jdbc-批量插入数据

    在Java编程领域,JDBC(Java Database ...总之,通过JDBC进行批量插入数据是提高数据库操作效率的重要手段。合理使用批量处理、预编译SQL语句以及数据库特有的优化功能,可以在处理大数据时获得显著的性能提升。

    批量插入数据到Oracle数据库Demo

    本教程将详细讲解如何进行批量插入数据到Oracle数据库,以提高数据导入的效率。 批量插入数据到Oracle数据库通常比单条插入更有效率,因为它减少了与数据库的交互次数,降低了网络延迟,并减少了系统资源的占用。...

    sql下三种批量插入数据的方法

    本文将介绍三种批量插入数据的方法。第一种方法是使用循环语句逐个将数据项插入到数据库中;第二种方法使用的是SqlBulkCopy,使您可以用其他源的数据有效批量加载 SQL Server 表;第三种使用的方法是sql server中的...

    C#.NET中如何批量插入大量数据到数据库中

    批量插入数据库时,有几种方法可以提高效率: 1. **使用SQL事务**:将多个插入操作封装在一个事务中,可以减少与数据库的交互次数,提高性能。在C#.NET中,可以使用`SqlConnection`的`BeginTransaction`、`Commit`...

    批量插入数据软件-含详细流程说明

    当我们需要快速填充大量的测试数据或初始化数据库时,批量插入数据软件就显得尤为实用。本篇将详细阐述如何使用一款专业的数据库智能创建数据软件,它具备自动导入百万条数据的能力,并且允许用户自定义数据格式,...

    批量插入大量数据

    在数据库操作中,批量插入大量数据是常见的性能优化策略,特别是在大数据处理或系统初始化时。批量插入能够显著减少网络通信次数,提升效率,降低数据库事务的开销。本例展示了如何在4秒内高效地插入10万条数据,...

    mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁)

    在批量插入数据的场景下,可以创建一个CountDownLatch对象,初始化为线程的数量,每个线程处理完自己的数据后调用`countDown()`方法,主线程通过调用`await()`方法等待所有线程完成后再执行后续操作,如提交事务。...

    Java实现mybatis批量插入数据到Oracle

    本篇文章将详细介绍如何利用Java和MyBatis实现批量插入数据到Oracle数据库中。 首先,我们需要理解Oracle数据库的一些基本概念。Oracle是世界上最流行的商业关系型数据库管理系统之一,以其强大的功能和高可靠性而...

    ASP 批量插入数据

    在ASP(Active Server Pages)开发中,批量插入数据是一个常见的需求,特别是在处理大量记录时,为了提高效率,避免频繁的数据库交互,批量插入是必不可少的技术。本文将详细讲解如何在ASP中实现批量插入数据,以及...

    C#实现批量插入sqlserver数据

    在C#编程中,批量插入数据到SQL Server数据库是一个常见的需求,特别是在处理大量数据时,效率至关重要。本篇文章将详细探讨三种不同的批量插入方法:常规的`INSERT`语句、`SqlBulkCopy`类以及使用表值参数。我们将...

    C# 批量插入和更新数据

    #### 二、批量插入数据 本案例展示了如何使用C#结合ADO.NET进行批量数据插入的操作。具体步骤如下: 1. **初始化参数**:首先定义了一个`DateTime`类型的变量`begin`用于记录开始时间,并通过`connectionString`...

    ThinkPHP 批量添加数据

    3. **批量插入**:ThinkPHP提供了`insertAll()`方法用于批量插入数据。这个方法接收一个包含多条记录的数组,并一次性插入数据库。示例如下: ```php $result = $userModel->insertAll($data); ``` 这里的`$...

    odbc 数据库批量插入操作

    批量插入数据通常涉及以下步骤: 1. **建立ODBC数据源**:在操作系统层面配置ODBC数据源,包括设置数据库服务器地址、用户名、密码以及选择对应的数据库驱动。 2. **创建连接**:在代码中,使用ODBC API函数如`...

    C#大数据批量插入Access程序

    本程序" C#大数据批量插入Access程序 "就是针对这种需求而设计的,它允许开发者高效地将大量数据导入到Access数据库中。 Access数据库虽然在处理大规模数据时可能不如SQL Server等大型数据库系统强大,但在某些场景...

    oracle oci 批量插入源代码

    批量插入(Batch Insert)是提高数据导入效率的重要手段,尤其在需要处理大量数据时,能显著减少网络通信和数据库调用次数,从而提升性能。 以下是对"Oracle OCI 批量插入源代码"的详细说明: 1. **oci_batch_...

    c# 对sqlite基本操作,带批量插入(百万级秒插)

    接下来,我们将讨论批量插入数据。在SQLite中,批处理通常通过命令参数化和使用Transaction来实现,以提高性能。以下是一个示例: ```csharp // 准备插入数据的列表 List<(string Column1, int Column2)> dataList ...

Global site tag (gtag.js) - Google Analytics