2012-02-19 118 views
3

我有以下格式的数据日志文件中的数据。高效的批量数据插入

每一行表示在数据库中的一行,并有500-1000的行同时被插入。

是最好直接通过调用存储过程插入数据库中的数据(该过程包含的逻辑调用日志文件和插入数据)

OR

是更好地解析它在应用程序和插入数据。

29 2011-02-01 11:00:40 1 0 1 0 
    30 2011-02-01 11:00:44 1 0 1 0 
    32 2011-02-01 11:00:49 1 0 1 0 
+0

请访问http:/ /msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx – Phil 2012-03-13 18:08:49

回答

0

这是更好(性能)来插入大量数据(使用LOAD FROM,或交易。我假设店没有类似的东西),而不是每行查询插入它们一次一个。

+0

你不觉得这是更好地创造一流的,并保持前处理逻辑在应用程序而不是数据库 – arjun 2012-02-20 13:22:40

+0

的SQL SER ver可能具有与您为编写预处理代码所编写的代码一样优化的函数。另外,它还节省了服务器和脚本之间的往返时间。您可以使用文件系统上的绝对路径来访问该文件(假设它位于同一台服务器上并具有适当的权限)。最后,只要您使用事务,就可以工作,对于500-1000行,直接使用数据库或解析脚本中的查询之间的性能差异最小。 – AlexanderZ 2012-02-21 02:23:29

+0

但是,如果您在线托管它,如何使用文件系统上的绝对路径。 – arjun 2012-02-21 03:59:04

1

这可能是.tsv格式(制表符分隔值)。

LOAD DATA LOCAL INFILE 'uniq.csv' INTO TABLE tbl 
    FIELDS TERMINATED BY '\t' 
    ENCLOSED BY '' 
    LINES TERMINATED BY '\n' 
(column1, column2, column3) 

\ t是制表符。如果它不起作用,请将其更改为空格。一行之后

手动处理行会效率不高,因为当你试图通过行逐行读取硬盘将被多次存取。 LOAD命令应该立即读取整个文件。

你应该记住,索引可以像这样的插入会严重减缓。如果您需要读取大量数据(例如100000行) - 有时在插入后更好地删除索引,插入和重新创建索引。

+0

但是另一个问题是,如果数据库和应用程序都在线托管,我如何从数据库访问文件 – arjun 2012-02-19 17:13:43

+0

您认为最好是在应用程序而不是数据库中创建类并保留预处理逻辑 – arjun 2012-02-20 13:21:12

1

您也可以使用BCP(批量复制)命令。

导入Excel中该日志文件并将其保存为单独列名的CSV。 使用以下语法在cmd提示符中导入到表中。

去$ \ Program Files文件\ Microsoft SQL Server的\ 100个\工具\ BINN在表名的命令提示符

BCP “d:\日志\ log.csv” -c -S服务器-U用户名-P密码-t “” -r “\ n”

你可以另外指定-n代替-c ... -t: - 逗号分隔,-r: - 行终止