创建从Microsoft SQL Server到AS / 400的连接

时间:2011-06-14 14:32:43

标签: tsql ssis odbc oledb ibm-midrange

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

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

这样运行正常,并返回1.7亿的数量:

select count(*)
from transactions

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

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

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

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

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

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

6 个答案:

答案 0 :(得分:3)

我不得不多次打这场战斗。

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

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

第三,1.7亿是很多记录,即使是像SQL服务器这样的关系型数据库,你是否考虑过每晚运行一个SSIS包,将你的数据分段到你自己的SQL表中,看看它是否能提高性能?

答案 1 :(得分: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
    
  5. 从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 
    

    希望有所帮助

答案 2 :(得分:1)

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

IBM技术支持也可以极其帮助诊断这些问题。不要害怕与他们取得联系,因为软件支持通常包含在维护合同中,并且无需与他们交谈。

我已经看到OLEDB连接占用100%cpu几个小时,当通过VisualExplain(查询分析器)运行相同的查询时,它估计仅执行几秒钟。

答案 3 :(得分:1)

我们发现运行这样的查询就像预期的那样:

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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