用SQL高效地插入大量的数据

嗨,我经常不得不插入大量的数据到表中。 例如,我会从excel或文本文件的forms的数据

1,a 3,bsdf 4,sdkfj 5,something 129,else 

那么我经常在这个例子中构造6个插入语句并运行SQL脚本。 当我发送数千个小包到服务器时,我发现这很慢,这也会给networking带来额外的开销。

你做这个最好的方法是什么?

更新:我正在使用ORACLE 10g。

使用Oracle外部表

另见例如

  • 关于外部表的OraFaq
  • 汤姆对外部桌子的看法
  • RenéNyffenegger关于外部桌子的笔记

一个简单的例子,应该让你开始

您需要位于服务器目录中的文件(熟悉目录对象 ):

 SQL> select directory_path from all_directories where directory_name = 'JTEST'; DIRECTORY_PATH -------------------------------------------------------------------------------- c:\data\jtest SQL> !cat ~/.gvfs/jtest\ on\ 192.168.xxx.xxx/exttable-1.csv 1,a 3,bsdf 4,sdkfj 5,something 129,else 

创build一个外部表格:

 create table so13t ( id number(4), data varchar2(20) ) organization external ( type oracle_loader default directory jtest /* jtest is an existing directory object */ access parameters ( records delimited by newline fields terminated by ',' missing field values are null ) location ('exttable-1.csv') /* the file located in jtest directory */ ) reject limit unlimited; 

现在,您可以使用SQL的所有function来访问数据:

 SQL> select * from so13t order by data; ID DATA ---------- ------------------------------------------------------------ 1 a 3 bsdf 129 else 4 sdkfj 5 something 

林不知道这是否在Oracle中工作,但在SQL Server中,您可以使用BULK INSERT sql语句从txt或csvfile upload数据。

 BULK INSERT [TableName] FROM 'c:\FileName.txt' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' ) GO 

只要确保表格列正确匹配txt文件中的内容即可。 使用更复杂的解决scheme,您可能需要使用格式文件,请参阅以下内容: http : //msdn.microsoft.com/en-us/library/ms178129.aspx

有很多方法可以加快速度。

1)在一次交易中完成。 这将通过避免连接打开/closures来加快速度。

2)直接加载为CSV文件。 如果您将数据加载为CSV文件,则根本不需要“SQL”语句。 在MySQL中,“LOAD DATA INFILE”操作非常直观,简单地完成了这一操作。

3)您也可以简单地将整个文件转储为一个名为“raw”的表格。 然后让数据库使用触发器自行parsing数据。 这是一个黑客,但它会简化你的应用程序代码,并减lessnetworking使用。