Sql server 使用Powerbuilder将数据从数据窗口/数据存储复制到SQL Server表的最快方法是什么

Sql server 使用Powerbuilder将数据从数据窗口/数据存储复制到SQL Server表的最快方法是什么,sql-server,powerbuilder,datastore,datawindow,Sql Server,Powerbuilder,Datastore,Datawindow,我们有一个数据存储(powerbuilderdatawindow的孪生姐妹),它包含超过40000行,插入Microsoft SQL Server表需要超过30分钟 目前,我正在使用一个脚本生成器为每一行生成sql表定义和insert命令。最后,将完整脚本发送到sql server以执行 我已经发现脚本生成过程消耗了整个任务的97%以上 您能帮我找到一种更有效的方法将客户端数据复制到sql server表中吗 Edit1(在NoazDad的评论之后): 在回答之前,请记住: Tabel结构是动

我们有一个数据存储(powerbuilderdatawindow的孪生姐妹),它包含超过40000行,插入Microsoft SQL Server表需要超过30分钟

目前,我正在使用一个脚本生成器为每一行生成sql表定义和insert命令。最后,将完整脚本发送到sql server以执行

我已经发现脚本生成过程消耗了整个任务的97%以上

您能帮我找到一种更有效的方法将客户端数据复制到sql server表中吗

Edit1(在NoazDad的评论之后):

在回答之前,请记住:

  • Tabel结构是动态的
  • 我试图避免使用datastore.Update()方法
按照我的理解,您是说在用户按下“GO”并启动脚本之前,插入数据的表甚至不存在于模式中?然后创建创建表的嵌入式SQL语句,并在循环中逐个插入行

那是。。。好吧,我只是说我不会这样做

您是否不知道该模式在将来会是什么样子?如果这样做,则针对该表绘制数据存储,并使用ds_1.Update()生成INSERT语句。使用数据窗口了解它的用途


如果这是不可能的,并且必须使用嵌入式SQL,那么至少每1000行左右执行一次提交。否则,SQLServer将针对表建立撤消日志,以防出现问题,必须回滚这些日志

按照我的理解,您是说在用户按下“GO”并启动脚本之前,插入数据的表甚至不存在于模式中?然后创建创建表的嵌入式SQL语句,并在循环中逐个插入行

那是。。。好吧,我只是说我不会这样做

您是否不知道该模式在将来会是什么样子?如果这样做,则针对该表绘制数据存储,并使用ds_1.Update()生成INSERT语句。使用数据窗口了解它的用途


如果这是不可能的,并且必须使用嵌入式SQL,那么至少每1000行左右执行一次提交。否则,SQLServer将针对表建立撤消日志,以防出现问题,必须回滚这些日志

不确定它是否会更快,但您可以将数据存储中的数据保存在以制表符分隔的文件中,然后通过Sql执行大容量插入。差不多

散装 插入CSVTest 从'c:\csvtest.txt' 具有 ( 字段终止符='\t', 行终止符='\n' ) 去


您可以尝试通过ds.object.datawindow.data语法将数据存储内容保存到字符串变量中,然后将其保存到文件中,然后执行SQL。

不确定这是否会更快,但您可以将数据存储中的数据保存到以制表符分隔的文件中,然后通过SQL执行大容量插入。差不多

散装 插入CSVTest 从'c:\csvtest.txt' 具有 ( 字段终止符='\t', 行终止符='\n' ) 去

您可以尝试通过ds.object.datawindow.data语法将数据存储内容保存到字符串变量中,然后将其保存到文件中,然后执行SQL。

其他想法

  • 在更新表时禁用更新表上的触发器(如果可能)
  • 使用PB管道对象,它有提交设置-可能更快,但不会太多
  • 好主意。在服务器端执行一些操作。我将尝试为40K insert创建SQL语句,并调用一个存储过程来发送所有40K insert/update语句,让该存储过程处理插入/更新
  • 创建一个包含几列(其中一列是长文本)的虚拟表,使用上一个想法中提到的SQL语句块对其进行更新,并使用一个进程来分隔和执行SQL语句
  • 上述的一些变体,但使用马特提到的批量插入。批量插入是插入多行的最快方法
  • 也许可以尝试使用自动提交功能,以便只在最后提交,或者按照某人已经提到的每10k行提交一次
  • PB在事务对象(连接)中有一个异步选项,也许您可以让更新在后台进行,让用户继续。这不适用于所有数据库,在您的情况下也可能不起作用。我使用异步选项运气不太好
您的进程如此缓慢的原因是PB会分别进行每个更新,因此您会不断地访问网络和数据库。更新表上可能有触发器,这些触发器也会受到影响。在服务器上使用它们可以消除网络延迟,而且速度更快。使用大容量加载速度更快,因为它不运行触发器,并消除了大量数据库管理开销

扩展了将SQL语句发送到过程的思想,您可以通过执行dw_1.saveas(SQL!)(语法不正确)并将其一次性发送到服务器来非常轻松地创建SQL。让服务器解析它并运行SQL

通过过程将类似的内容发送到服务器,它应该更新得非常快,因为它只有一条语句:

Update TABLE set (col1, col2) values ('a', 'b')|Update TABLE set (col1, col2) values ('a', 'b')|Update TABLE set (col1, col2) values ('a', 'b')
在程序上:

解析sql语句并运行它们。简单明了。

其他想法

  • 在更新表时禁用更新表上的触发器(如果可能)
  • 使用PB管道对象,它有提交设置-可能更快,但不会太多
  • 好主意。在服务器端执行一些操作。我将尝试为40K insert创建SQL语句,并调用一个存储过程来发送所有40K insert/update语句,让该存储过程处理插入/更新
  • 创建一个包含几列的虚拟表,o