【问题标题】:Insert large amount of data efficiently with SQL使用 SQL 高效插入大量数据
【发布时间】:2011-10-06 23:53:27
【问题描述】:

您好,我经常需要向表中插入大量数据。例如,我会以

的形式从 excel 或文本文件中获取数据
1,a
3,bsdf
4,sdkfj
5,something
129,else

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

你最好的方法是什么?

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

【问题讨论】:

  • 您只需要构造一个 SQL 插入语句,将所有这些行包含为 VALUES (),() 项。
  • 使用外部表读取文本文件或csv并从外部表中批量插入。
  • @EJP:Oracle 不接受这种语法。
  • Filehelpers Excel to Oracle db 的可能重复项
  • EJP,你能举个例子吗?

标签: sql oracle excel file-upload plsql


【解决方案1】:

使用Oracle external tables

参见例如

一个可以帮助您入门的简单示例

您需要一个位于服务器目录中的文件(熟悉directory objects):

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

创建外部表:

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 的所有功能 来访问数据:

SQL> select * from so13t order by data;

        ID DATA
---------- ------------------------------------------------------------
         1 a
         3 bsdf
       129 else
         4 sdkfj
         5 something
【解决方案2】:

我不确定这是否适用于 Oracle,但在 SQL Server 中,您可以使用 BULK INSERT sql 语句从 txt 或 csv 文件上传数据。

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

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

【讨论】:

    【解决方案3】:

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

    1) 在单个事务中完成。这将通过避免连接打开/关闭来加快速度。

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

    3) 您也可以简单地将整个文件作为文本转储到一个名为“raw”的表中。然后让数据库使用触发器自行解析数据。这是一个 hack,但它会简化您的应用程序代码并减少网络使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-25
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      相关资源
      最近更新 更多