通过VBA将3000个插入程序加速上传到Teradata

非常感谢jacouh( VBA复制和粘贴3000行 )给我最初的问题的答案。 在论坛的帮助下,我现在有下面的代码,从Excel文件中插入2999行。 每行是INSERT (X, Y, Z, ...) VALUES (X1, Y1, Z1,...) into DBNAME.TABLE 。 虽然它的工作,它是痛苦的缓慢。 据我所知,我可以通过增加缓冲区的大小来增加插入的速度,如http://developer.teradata.com/doc/connectivity/tdnetdp/13.11/webhelp/Teradata.Client.Provider~Teradata .Client.Provider.TdConnectionStringBuilder〜ResponseBufferSize.html 。 我试图把它纳入失败。 有人可以推荐一个可能的集成来增加响应缓冲区的大小。 非常感谢。 以前我已经探索过不同的论坛,这绝对是最好的。 当然。 任何其他的想法,比我目前使用的(约插入大约3000行15表),请让我知道!

 Sub Insert_to_TD() Dim cn As ADODB.Connection Set cn = New ADODB.Connection Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset Dim cmdsqldata As ADODB.Command Set cmdsqldata = New ADODB.Command Dim i, strSQL cn.Open "DSN=NNNNNN; Username=XXXXX; Password=YYYYYYY;" Set cmdsqldata.ActiveConnection = cn cmdsqldata.CommandType = adCmdText cmdsqldata.CommandTimeout = 0 For i = 1 To 2999 strSQL = ActiveSheet.Cells(i, 1).Value cmdsqldata.CommandText = strSQL Set rs = cmdsqldata.Execute() Next End Sub 

Teradata可以并行插入数据行(如在Teradata SQL Assistant中打F9)。 您可以提交长度最大为1 MB的查询,多个语句以分号分隔,例如:

 "INSERT (X, Y, Z, ...) VALUES (X1, Y1, Z1,...) into DBNAME.TABLE; INSERT (X, Y, Z, ...) VALUES (X1, Y1, Z1,...) into DBNAME.TABLE; INSERT (X, Y, Z, ...) VALUES (X1, Y1, Z1,...) into DBNAME.TABLE; INSERT (X, Y, Z, ...) VALUES (X1, Y1, Z1,...) into DBNAME.TABLE;" 

把整个string一次放500行,然后你只需要循环执行6条语句来处理所有的3000行。这样可以加快你的进程至less10倍。 使用非单线程语言或使用VBA的一些技巧将允许您一次将多个这样的语言发送到Teradata,根据您的Teradata服务器的容量和允许的连接数量,这可能会额外增加10倍。

但罗布与其他Teradata公用事业公司走在了一起。 有一个原因,那就是VBA-teradata的操纵是艰难而缓慢的。

我build议你考虑在你的VB代码中用参数使用一个准备好的语句。 那么你有几个select:

  1. 使用参数一次循环遍历Excel工作表中的一行,并分配参数值并执行迭代,就像您在上面的原始代码示例中一样。 这将比你的原始代码更快
  2. 如果可能的话(我的ADO和VB编程技巧是生锈的)创build一个参数数组,定义Excel工作表中的所有行和列,并对数据库执行一个批处理语句。 这将是将数据应用于数据库的最快方法。

我确信有很多关于如何使用SO或ADO / VB代码build议的方法或使用Googlesearch如果您遇到困难的例子。

或者,您可以将Excel工作表保存为CSV文件,并将其作为Teradata实用程序(如BTEQ,FastLoad,MultiLoad或Teradata Parallel Transport)之一的源文件。