`
zhengdl126
  • 浏览: 2538501 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

大量数据插入的几种方式的速度比较

阅读更多

在设计数据库里,我们就应该去数据库设计的性能进行评估。但是在经验不足的情况下,就需要快速建立一个和真实环境相近的数据库,进行性能测试。在这个过程中,遇到的第一个问题就是如何快速地插入千万级数据。

一个新手可能会写出下面的代码。(索引未建)

 

Insert into dbo.Simple values (@I, RAND() * 2000000000)

 

然后在外面加个循环。大概测试了一个,10万数据,用时100秒。那么1000万数据,就要用时1万秒。大约是将近3个小时。(好吧,我知道我的电脑很烂。服务里上只要1个小时20分钟。)这个速度是难以让人接受的。因为拥有1000万数据的数据库,直接从文件导入数据,大约只需要不到10分钟。我们希望造假数据的速度和这个时间在同一个单位级别上吧。

 

其实最简单的办法,就是在刚才写好的语句前加个Begin Tran然后结尾加个Commit Tran就可以了。这个方式插入1000万条数据,大约用时18.5分钟。代码如下:

 

Declare @I int

Set @I = 0

Begin Tran

InsertData:

Insert into dbo.Simple values (@I, RAND() * 2000000000)

Set @I = @I + 1

If @I < 100000

    Goto InsertData

Commit Tran

 

还有一个方法就是拼SQL,因为之前都是一个Insert语句插入一条数据,但是Insert是可以一次插入多条的啊。可以定义一个varchar(8000)变量,然后把要插入的假数据接在后面。最后用EXEC运行。如下。

 

Declare @I int

DECLARE @sql varchar(8000)

Set @I = 0

ResetSql:

Set @sql = 'Insert into dbo.Simple values '

ComInsert:

Set @sql = @sql + '(' + CONVERT(varchar(10), @I) + ',' + CONVERT(varchar(10), Convert(int, RAND() * 2000000000)) + ')'

If @I % 300 = 299

Begin

    exec (@sql)

    Set @I = @I + 1

    Goto ResetSql

End

Set @I = @I + 1

If @I < 100000

Begin

    Set @sql = @sql + ','

    Goto ComInsert

End

 

怎么这么复杂?首先因为varchar(8000)放不下所有的数据,所以要分批插入。而且简单起见上面的代码并没有做到准确地插入1000万条,而是插入了9999900条。

这个比第二种方式稍稍快一点。用时15分钟。不过为了这么点性能,多写这么多代码,感觉还是不太值得,除非要是插入上亿数据,省下半小时时间还是值得的。

 

另外,如果需要多次清空、重新插入。那么把之前的数据导出到TEXT文件里会更快一些,如上文所说,导入1000万数据要10分钟。导出也只要2分钟。

 

导出的代码如下:

 

EXEC master.dbo.sp_configure 'show advanced options', 1

RECONFIGURE

EXEC master.dbo.sp_configure 'xp_cmdshell', 1

RECONFIGURE

 

EXEC xp_cmdshell 'bcp "SELECT * FROM Sample.dbo.Simple" queryout "C:"data.txt" -T -S(local)"SQLEXPRESS -c -t,'

 

生成的Text文件是以逗号将每列分开的一列一行纯文本文件。

 

导入的代码如下:

 

bulk insert dbo.Simple from 'C:"data.txt' with(fieldterminator=',', rowterminator='"n')

 

不知道大家有更快的方法吗?

2009年9月14日更新:

发现自己还是基础太差了,书上就有的方法自己在这里研究这么半天。上面导文件的方法也需要10分钟,下面这个方法,纯SQL,只需要5分钟,就可以生成1000万数据。

IF OBJECT_ID('dbo.Nums') IS NOT NULL
  DROP TABLE dbo.Nums;
GO
CREATE TABLE dbo.Nums(n INT NOT NULL PRIMARY KEY);
DECLARE @max AS INT, @rc AS INT;
SET @max = 5000000;
SET @rc = 1;

INSERT INTO Nums VALUES(1);
WHILE @rc * 2 <= @max
BEGIN
  INSERT INTO dbo.Nums SELECT n + @rc FROM dbo.Nums;
  SET @rc = @rc * 2;
END

INSERT INTO dbo.Nums SELECT n + @rc FROM dbo.Nums WHERE n + @rc <= @max;

--以上函数取自Inside SQL Server 2005: T-SQL Query一书。

INSERT dbo.Sample SELECT n, RAND(CAST(NEWID() AS BINARY(16))) FROM Nums

分享到:
评论

相关推荐

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

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

    大量数据插入 sql语句

    为了优化这一过程,SQL Server 提供了几种批量插入数据的方法,包括 `BULK` 和表值参数 (Table-Valued Parameters)。 #### 1. 基础环境搭建 首先,我们需要创建一个用于测试的数据库和表。示例中使用的 SQL 脚本...

    Oracle插入大量数据

    根据给定文件的信息,“Oracle插入大量数据”的主题围绕着几种有效的策略展开,旨在提升Oracle数据库在大数据量场景下的性能表现。 ### 高速存储设备的应用 首先提及的是采用高速的存储设备来提升读写能力。EMC和...

    .Net中批量插入的几种实现方法

    在.NET开发中,数据操作是常见任务之一,尤其是在处理大量数据时,批量插入可以显著提高效率。本篇文章将深入探讨.NET中实现批量插入的几种主要方法,并对比它们的性能和适用场景。 首先,最基础的方法是通过循环...

    Database system concepts的数据插入

    数据插入有几种不同的形式: 1. **完整插入**:如上例所示,提供所有列的值。这是最常见的情况,适用于所有列都有明确值的情况。 2. **部分插入**:如果表中有默认值或允许为空的列,我们可以选择只插入部分列的值...

    将EXCEL数据 插入ORACLE数据库

    在IT行业中,将Excel数据插入Oracle数据库是一项常见的任务,尤其对于数据分析、报表生成以及数据迁移等场景至关重要。本文将详细讲解如何实现这一过程,并探讨相关的技术细节和优化策略。 首先,我们需要了解Excel...

    数据结构 折半插入排序

    折半插入排序是一种原地排序算法,除了存储原始数据之外,仅需要几个额外的变量空间,因此空间复杂度为O(1)。 #### 折半插入排序与普通插入排序的区别 主要区别在于寻找插入位置的方式不同: - **普通插入排序**:...

    sqlite3性能优化源代码 数据插入 开启事务 执行准备 性能提升 每秒百万条数据写入

    在本文中,我们将深入探讨如何通过优化SQLite3的源代码来提高数据插入性能,尤其是如何利用事务和执行准备来实现每秒百万条数据的写入速度。 首先,了解SQLite3的事务机制是至关重要的。在SQLite3中,事务用于确保...

    几种数据库的大数据批量插入

    SqlBulkCopy 类提供了一个高效的方式来将大量数据批量插入到数据库中。下面是一个使用 SqlBulkCopy 实现批量插入的示例: public sealed class MsSqlBatcher : IBatcherProvider { public ServiceContext ...

    MySQL大量数据插入各种方法性能分析与比较

    MySQL在处理大量数据插入时,性能优化至关重要,不同的插入方法会显著影响操作的速度。本文将对几种常见的数据插入策略进行分析和比较,包括单条插入、批量插入、事务处理和使用`LOAD DATA INFILE`命令。 首先,...

    plsql批量导入数据

    在Oracle数据库环境中,PL/SQL ...以上就是PLSQL中批量导入数据的几种常见方法,根据实际需求选择合适的方式,可以显著提高数据导入效率。在使用过程中,注意数据的一致性和完整性,以及对可能产生的错误进行适当处理。

    Word眼里的数据库—在Word文档中导入外部数据源的几种方法.doc

    插入数据后,可以使用"表格自动套用格式"来调整表格样式,或在数据插入后单独编辑表格格式。 其次,Word的“邮件合并”功能也能实现数据导入。虽然它的主要目的是创建批量个性化文档,如信函、标签或信封,但同样...

    在vector和list中插入数据

    它的插入操作主要有以下几种: 1. **在末尾插入元素**: `push_back(Elem)` - 这是最常见的插入方式,向vector的末尾添加一个元素,时间复杂度为O(1),但如果vector需要扩容(容量不足时),则时间复杂度会增加到O(n...

    存储过程(循环插入数据)

    为了解决这个问题,可以尝试以下几种方法: 1. **使用正确的执行环境**:确保在支持PL/SQL的环境中运行存储过程,如Oracle的客户端工具。 2. **调整执行语句**:尝试将存储过程中的代码转化为可以直接在DbVisualizer...

    数据结构几种查找算法

    本主题将深入探讨几种常见的查找算法,包括二分查找(Binsearch)、二叉搜索树(BSTree)、哈希查找(Hash)以及顺序查找(Seqsearch)。这些算法在不同的场景下有着各自的优点和适用性,理解并掌握它们对于优化程序...

    IOS数据持久化的几种方式

    - **SQLite (FMDB)**:适合大量结构化数据,性能优秀,但需要编写SQL语句。 - **Core Data**:更适合复杂的业务逻辑和数据模型,提供了强大的查询能力,但学习曲线较陡峭。 - **Archiver**:简单易用,适合小量非...

    EF批量更新、批量插入、 批量删除使用的是EFUtilities,免费的操作简单,速度超级快

    在常规的EF操作中,如果需要将大量数据插入数据库,可能需要多次调用`SaveChanges()`方法,每次插入一条记录。这不仅消耗时间,还可能导致数据库锁竞争,降低性能。使用EFUtilities,开发者可以一次性提交多条记录,...

    向数据库中导入数据的几种方法

    数据库是存储和管理信息的重要工具,对于数据的导入操作,有多种方法可以帮助我们高效地将大量数据输入到数据库中。以下是一些常见的数据库导入数据的方法: 1. **SQL INSERT语句**: 最基础的方式是使用SQL的...

    oracle删除重复数据的几种方法

    oracle 删除重复数据的几种方法 在 Oracle 中,删除重复的数据是一种常见的操作。delete 操作可以用来删除重复的数据,但是需要根据实际情况选择合适的方法。下面将介绍四种删除重复数据的方法,每种方法都有其优...

Global site tag (gtag.js) - Google Analytics