AS400 / SQL Server 2008 R2数据传输性能改进

时间:2013-11-27 13:29:02

标签: stored-procedures reporting-services sql-server-2008-r2 ibm-midrange linked-server

我们最近将JD Edwards EnterpriseOne系统从AS400 / DB2平台转换为Windows& SQL Server。在旧系统中,我们有一个RPG / CL程序,它将数据从AS400库传输到会计系统进行进一步处理。最终用户需要启动此过程,以便通过菜单命令执行。

要在转换后复制此行为,我在SQL Server 2008 R2中创建了一个存储过程,该存储过程通过链接服务器从as400将记录插入SQL Server数据库,然后更新as400上的记录以指示记录已存在处理。为了让最终用户能够执行此过程,我创建了一个执行存储过程的SSRS(2005)报告。

当SSRS报告以交互方式执行时,我们间歇性地收到错误“出于安全原因,此XML文档中禁止DTD”,我的研究是由SSRS内存不足引起的。

有没有人知道传输数据的另一种/更好的方式?

存储过程的传输/更新基本上是

INSERT INTO [SQL DEST TABLE] 
    SELECT * 
    FROM [AS400 Linked Server/Table]

UPDATE OPENQUERY (AS400_LINK, 'MY SELECT QUERY')
SET FLAG = PROCESSED;

1 个答案:

答案 0 :(得分:0)

您应该获得更好的数据库性能,允许服务器在可能的情况下使用自己的数据执行工作,而不是必须来回传输。

我会对情况做一些猜测,如果你纠正我,我会很乐意根据你的情况调整答案。这听起来像是从DB2中的记帐事务表中提取数据,并且完成后,您希望更新这些记录中的标志。这可能表明记录可能永远保留在该表中,或者可能是某些其他进程将其清除。 SELECT上没有WHERE,所以我认为它们会被删除。我将假设我们不知道是否可以随时将更多记录添加到事务表中,包括提取信息和更新标志之间的任何时间段。

我想知道你是否可以在提取之后立即更新标志,然后才真正处理SQL Server?这是否可以在后勤和业务要求范围内进行?

假设你......

  1. 将DB2未处理的事务数据提取到工作文件中,
  2. 将工作文件传输到SQL Server,
  3. 执行您在SQL Server中要执行的任何处理
  4. 告诉DB2根据工作文件
  5. 更新事务表

    所以在DB2中,#1可能看起来像

    INSERT INTO workfile
      SELECT * 
        FROM transactions
        WHERE flag = unprocessed
    

    在第3步中,SQL Server作业可能会将工作文件中的标志更新为错误状态,以防SQL Server无法正常处理的任何记录。

    DB2上的第4步可能是

    UPDATE transactions
      SET flag = processed
      WHERE transid IN (SELECT transid
                          FROM workfile
                          WHERE flag <> error
                       )
    

    希望SQL Server上的处理错误相当少见。如果该进程更新工作文件中的事务,仅在出现错误时,这应该比为每次成功传输更新更快。上面的UPDATE语句应该能够在DB2上运行得更快,因为它是由同一服务器上的工作文件驱动的,而不是将数据传输回DB2。