Sql Server 大数量插入方法简单汇总

标签: sql server 数量 | 发表时间:2011-09-08 18:21 | 作者:HorsonJin ddtd
出处:http://www.cnblogs.com/

文/金延涛

问题

   在某些场景下,可能需要在短时间内向数据库中插入大量数据,数据来源可能是性能非常高的实时数据库或者文件,然后转换为关系数据库中的内容,这就要求关系数据库具有非常高的写入性能。

解决办法

    解决办法1:在默认情况下,Sql Server把每一次写入当做一个事物处理,在大数据量写入的情况下,每一次写入的事物处理需要耗费非常多的性能和时间,如果插入10w条记录,使用10w次insert语句,在普通pc上30秒钟都无法完成,如果仅启用一次事物,然后做10W次insert操作,仅需要短短的1秒钟就可以完成。

    解决办法2:使用SqlBulkCopy,使用SqlBulkCopy可以在大数据量转移时在很大程度上提高性能,使用该类的ColumnMappings属性可以建立源表和目标表的映射关系,实例代码如下:

string connectionString = ConfigurationManager.ConnectionStrings["MyDatabase"].ConnectionString; 
SqlConnection myConnection
= new SqlConnection(connectionString);

SqlCommand myCommand
= new SqlCommand("SELECT * FROM Person", myConnection);

myConnection.Open();

SqlDataReader dr
= myCommand.ExecuteReader();

SqlConnection myNewConnection
= new SqlConnection(connectionString);

myNewConnection.Open();

SqlBulkCopy bulk
= new SqlBulkCopy(myNewConnection);

bulk.DestinationTableName
= "[Person2]";

bulk.ColumnMappings.Add(
"Name", "LastName");

bulk.ColumnMappings.Add(
"Email", "Email");

bulk.ColumnMappings.Add(
"Picture", "Picture");

try

{

bulk.WriteToServer(dr);

}

catch (Exception ex)

{

Response.Write(ex.Message);

}

finally

{

myNewConnection.Close();

dr.Close();

myConnection.Close();

bulk.Close();

}

小结

      相信海量数据插入方面,还有更多更好的方法,因为遇到了相关问题,草草收集了一些简单的处理方法,后续还会补充更新中,希望各位网友也不吝赐教了。 

 

作者: HorsonJin 发表于 2011-09-08 18:21 原文链接

评论: 0 查看评论 发表评论


最新新闻:
· Google 应对甲骨文可能失利 & One more thing(2011-09-08 18:05)
· 巴茨任职期15 瞬间 :裁员 爆粗口 拒绝售股(2011-09-08 17:34)
· Ruby作者松本行弘将推出针对移动计算的Ruby分支(2011-09-08 17:30)
· Xbox 360名列8月美国畅销游戏机第一(2011-09-08 17:22)
· 巴茨在雅虎犯下的八大错误(2011-09-08 16:08)

编辑推荐:用ASP.NET写自己的服务框架

网站导航:博客园首页  我的园子  新闻  闪存  小组  博问  知识库

相关 [sql server 数量] 推荐:

SQL Server--索引

- - CSDN博客推荐文章
         1,概念:  数据库索引是对数据表中一个或多个列的值进行排序的结构,就像一本书的目录一样,索引提供了在行中快速查询特定行的能力..             2.1优点:  1,大大加快搜索数据的速度,这是引入索引的主要原因..                             2,创建唯一性索引,保证数据库表中每一行数据的唯一性..

SQL Server 面试

- - SQL - 编程语言 - ITeye博客
在SQL语言中,一个SELECT…FROM…WHERE语句称为一个查询块,将一个查询块嵌套在另一个查询块的WHERE子句中的查询称为子查询. 子查询分为嵌套子查询和相关子查询两种. 嵌套子查询的求解方法是由里向外处理,即每个子查询在其上一级查询处理之前求解,子查询的结果作为其父查询的查询条件. 子查询只执行一次,且可以单独执行;.

Sql Server 大数量插入方法简单汇总

- ddtd - 博客园-首页原创精华区
   在某些场景下,可能需要在短时间内向数据库中插入大量数据,数据来源可能是性能非常高的实时数据库或者文件,然后转换为关系数据库中的内容,这就要求关系数据库具有非常高的写入性能.     解决办法1:在默认情况下,Sql Server把每一次写入当做一个事物处理,在大数据量写入的情况下,每一次写入的事物处理需要耗费非常多的性能和时间,如果插入10w条记录,使用10w次insert语句,在普通pc上30秒钟都无法完成,如果仅启用一次事物,然后做10W次insert操作,仅需要短短的1秒钟就可以完成.

SQL Server优化50法

- - CSDN博客推荐文章
虽然查询速度慢的原因很多,但是如果通过一定的优化,也可以使查询问题得到一定程度的解决.   查询速度慢的原因很多,常见如下几种:没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷).   I/O吞吐量小,形成了瓶颈效应.   没有创建计算列导致查询不优化.   内存不足网络速度慢查询出的数据量过大(可以采用多次查询,其他的方法降低数据量).

SQL Server 中的事务

- - CSDN博客推荐文章
       事务要有非常明确的开始和结束点,SQL Server 中的每一条数据操作语句,例如SELECT、INSERT、UPDATE和DELETE都是隐式事务的一部分. 即使只有一条语句,系统也会把这条语句当做一个事务,要么执行所有的语句,要么什么都不执行.         事务开始之后,事务所有的操作都会写到事务日志中,写到日志中的事务,一般有两种:一是针对数据的操作,例如插入、修改和删除,这些操作的对象是大量的数据;另一种是针对任务的操作,例如创建索引.

SQL Server优化50法

- - CSDN博客数据库推荐文章
  虽然查询速度慢的原因很多,但是如果通过一定的优化,也可以使查询问题得到一定程度的解决.   查询速度慢的原因很多,常见如下几种:. 没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷). I/O吞吐量小,形成了瓶颈效应. 查询出的数据量过大(可以采用多次查询,其他的方法降低数据量).

SQL Server 查询步骤 - pursuer.chen

- - 博客园_首页
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/查询步骤.       查询步骤是很基础也挺重要的一部分,但是我还是在周围发现有些人虽然会语法,但是对于其中的步骤不是很清楚,这里就来分解一下其中的步骤,在技术内幕系列里面都会有讲到.  TOP于ORDER BY的关系. INSERT INTO Customers VALUES(1,'深圳'),(2,'广州'),(3,'武汉'),(4,'上海'),(5,'北京').

sql server复灾 你懂了吗?

- brett80 - 博客园-首页原创精华区
很多时候我们不小心错误delete了一下,或者update一下怎么办,或者直接把数据库删除了,怎么办呢,是不是就一定没有办法呢. 下面让我来教大家我现学现卖的两招. 做之前我们要设置数据库恢复模式:. 首先我们创建一个表:插入几条数据. 我们现在有五条数据了,我们对数据做一个备份. 做任何差异备份,和日志之前,一定要做一个完整备份.

监控 SQL Server 的运行状况

- Bloger - 博客园-首页原创精华区
Microsoft SQL Server 2005 提供了一些工具来监控数据库. 动态管理视图 (DMV) 和动态管理函数 (DMF) 返回的服务器状态信息可用于监控服务器实例的运行状况、诊断问题和优化性能. 常规服务器动态管理对象包括:. dm_db_*:数据库和数据库对象. dm_exec_*:执行用户代码和关联的连接.

SQL Server 数据库巡检脚本

- - CSDN博客数据库推荐文章
select '现在没有阻塞和死锁信息' as message. select '引起数据库死锁的是: '+ CAST(@bl AS VARCHAR(10)) + '进程号,其执行的SQL语法如下'. select '进程号SPID:'+ CAST(@spid AS VARCHAR(10))+ '被' + '进程号SPID:'+ CAST(@bl AS VARCHAR(10)) +'阻塞,其当前进程执行的SQL语法如下'.