【问题标题】:Creating a connection from Microsoft SQL server to an AS/400创建从 Microsoft SQL 服务器到 AS/400 的连接
【发布时间】:2011-06-14 14:32:42
【问题描述】:

我正在尝试从 Microsoft SQL 服务器连接到 AS/400,以便我可以从 AS/400 中提取数据,然后将数据标记为被提取。

我已经成功创建了 OLE DB“IBMDASQL”连接,并且能够提取一些数据,但是当我尝试从一个非常大的表中提取数据时遇到了问题

这运行良好,并返回 1.7 亿个计数:

select count(*)
from transactions

这个查询在我放弃之前执行了 15 个小时。 (它应该返回零,因为我还没有将任何东西标记为“处理中”)

select count(*) 
from transactions
where processed = 'In process'

我是 Microsoft 人员,但我的 AS/400 人员说“已处理”列上有一个索引,并且在本地,该查询会立即运行。

对我可能做错了什么有任何想法吗?我找到了一个只有 68 条记录的表,并且能够在大约一秒钟内运行此查询:

select count(*)
from smallTable
where RandomColumn = 'randomValue'

所以我知道 AS/400 至少能够理解这种类型的查询。

【问题讨论】:

    标签: tsql ssis odbc oledb ibm-midrange


    【解决方案1】:

    我不得不多次打这场仗。

    有两种方法可以解决这个问题。

    1) 将您的数据从 AS400 暂存到 SQL 服务器中,您可以在其中优化索引
    2) 要求 AS400 人员创建加速数据检索的逻辑视图,您的 AS400 程序员是正确的,索引会有所帮助,但我忘记了他们用来定义类似于 sql server 视图的“视图”的术语,我相信它类似于“物理”与“逻辑”。逻辑就是你想要的。

    第三,1.7 亿条记录是很多记录,即使对于像 SQL Server 这样的关系数据库,您是否考虑过每晚运行一个 SSIS 包,将您的数据暂存到您自己的 SQL 表中,看看它是否会提高性能?

    【讨论】:

    • 我肯定会做第一。谢谢,关于#2的建议。我想如果 AS/400 能够在几毫秒内执行查询,那么我应该从远程连接中看到相同的性能。你知道逻辑视图是否支持更新吗?
    • 1.7 亿条记录对于 i 来说不算什么。我听他们谈论过数十亿条记录。
    • @TizzyFoe,远程连接的性能与AS400的本机性能不一样,所以AS400本机快,远程很慢,因为IBMDASQL驱动程序需要翻译所有的SQL语句。关于更新,只有当 AS400 物理文件处于日记状态时,您才能更新 AS400 记录集。
    【解决方案2】:

    我会建议这种方式来获得良好的性能,我想你至少有SQL2005,我还没有测试过,但这是一个提示

    通过在AS400中创建存储过程,让AS400以本机方式执行选择

    1. 打开一个 AS400 会话
    2. 启动 STRSQL
    3. 以这种方式创建一个 AS400 存储过程来获取/更新记录集

      CREATE PROCEDURE MYSELECT (IN PARAM CHAR(10))
      LANGUAGE SQL 
      DYNAMIC RESULT SETS 1 
      BEGIN 
      DECLARE C1 CURSOR FOR SELECT * FROM MYLIB.MYFILE WHERE MYFIELD=PARAM;
      OPEN C1;
      RETURN; 
      END
      
    4. 创建一个 AS400 存储过程来更新记录集

      CREATE PROCEDURE MYUPDATE (IN PARAM CHAR(10))
      LANGUAGE SQL 
      RESULT SETS 0 
      BEGIN 
      UPDATE MYLIB.MYFILE SET MYFIELD='newvalue' WHERE MYFIELD=PARAM;
      END
      

    从 SQL SERVER 调用那些 AS400 SP

    declare @myParam char(10)
    set @myParam = 'In process'
    -- get the recordset
    EXEC ('CALL NAME_AS400.MYLIB.MYSELECT(?) ', @myParam) AT AS400 -- < AS400 = name of linked server
    -- update
    EXEC ('CALL NAME_AS400.MYLIB.MYUPDATE(?) ', @myParam) AT AS400 
    

    希望对你有帮助

    【讨论】:

    • 在数字 3 中,您为什么要创建光标?在第 4 项中,您是否缺少 'set myUpdateField = 'MyNewValue' 类型的行?
    • 哦,是的,只是关于第 4 点的错字,只是修正了光标,在您的 AS400 的操作系统版本上,您也可以尝试不使用。如前所述,我还没有测试,我只是为你写了一个小贴士的答案,但过去我在 SQL 和 AS400 的这个场景中做了很多
    • 感谢您的帮助。我要看看沿着这条路走下去。我会更新结果。谢谢
    【解决方案3】:

    我建议按照 IBM 红皮书SQL Performance Diagnosis on IBM DB2 Universal Database for iSeries 中的建议来确定实际发生的情况。

    IBM 技术支持也可以非常帮助诊断此类问题。不要害怕与他们联系,因为软件支持通常包含在维护合同中,与他们交谈是免费的。

    我已经看到 OLEDB 连接数小时消耗 100% cpu,当通过 VisualExplain(查询分析器)运行相同的查询时,它估计只需几秒钟即可执行。

    【讨论】:

      【解决方案4】:

      我们发现像这样运行查询的结果符合预期:

      SELECT *
      FROM OpenQuery( LinkedServer,
          'select count(*) 
          from transactions
          where processed = ''In process''')
      GO
      

      【讨论】:

        【解决方案5】:

        这可能是排序规则问题吗? - 您的 WHERE 子句正在对文本字段进行测试,如果两台服务器的排序规则不匹配,则将在客户端而不是服务器端应用此子句,因此您首先将所有 1.7 亿条记录拉到客户端,然后在那里执行WHERE 子句。

        【讨论】:

          【解决方案6】:

          根据我过去的交互,无论您如何访问数据,查询都应该花费大约相同的时间。另一个想法是您是否可以在表上创建一个视图以获取您需要的数据或使用存储过程。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-06-11
            • 2016-02-16
            • 1970-01-01
            • 1970-01-01
            • 2018-04-21
            • 1970-01-01
            • 2021-02-16
            相关资源
            最近更新 更多