通过VBA加快向Teradata上传3000个插入内容

时间:2013-11-12 23:27:47

标签: sql excel vba response teradata

非常感谢jacouh(VBA Copy & Paste 3000 rows)对我最初问题的回答。在论坛的帮助下,我现在有以下代码,它从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中所述。我试图加入它并失败了。有人可能会建议可能的集成来增加响应缓冲区大小。非常感谢。我之前曾探索过不同的论坛,这绝对是最好的论坛。当然。任何其他想法,比我目前使用的想法更好(在大约15个不同的表中插入约3000行),请告诉我!)

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

2 个答案:

答案 0 :(得分:2)

我建议您考虑在VB代码中使用带参数的预准备语句。然后你有几个选择:

  1. 使用参数循环遍历Excel工作表,一次一行,并分配参数值并执行迭代,就像在上面的原始代码示例中一样。这比原始代码更快
  2. 如果可能(我的ADO和VB编码技能生锈)创建一个参数数组,这些参数定义Excel工作表中的所有行和列,并对数据库执行单个批处理语句。这将是将数据应用到数据库的最快方法。
  3. 我确信有很多关于如何使用完成我在ADO / VB代码中建议的方法或者如果你遇到困难时使用谷歌搜索的例子。

    或者,您可以使用Excel工作表并将其另存为CSV,该CSV可用作其中一个Teradata实用程序(如BTEQ,FastLoad,MultiLoad或Teradata Parallel Transport)的源。

答案 1 :(得分:2)

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;"

将整个字符串一次放入可能有500行到strSQL中,然后你只需循环执行6个语句来处理所有3000个。这样可以使你的过程加速至少10倍。使用VBA的非单线程语言或一些技巧将允许您一次向Teradata发送多个这样的语言,这可能会额外增加10倍,具体取决于您的Teradata服务器的容量和连接数量允许的。

但是罗布与其他Teradata公用事业公司走在了正确的轨道上。这些存在是有原因的,并且VBA-teradata操纵是艰难而缓慢的。