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

| 我正在尝试从Microsoft SQL Server连接到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至少能够理解该类型的查询。     
已邀请:
        我不得不多次参加这场战斗。 有两种解决方法。 1)将数据从AS400分段到SQL服务器,在此您可以优化索引 2)请AS400人员创建逻辑视图以加快数据检索速度,您的AS400程序员是正确的,索引会有所帮助,但是我忘记了他们用来定义类似于SQL Server视图的“视图”的术语,我相信它类似于“物理” v / s“逻辑”。逻辑就是您想要的。 第三,1.7亿条记录很多,即使对于像SQL Server这样的关系数据库,您是否考虑过每晚运行一个SSIS程序包,将您的数据分段到自己的SQL表中以查看它是否提高了性能?     
        我建议用这种方法来表现良好,我想你至少有3英镑,我还没有测试过,但这是一个提示 通过在AS400中创建存储过程,使AS400以本机方式执行选择 打开一个AS400会话 启动STRSQL 以这种方式创建一个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
创建一个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 
希望能帮助到你     
        我建议按照IBM DB2通用数据库iSeries版IBM Redbook SQL性能诊断中的建议来确定实际发生的情况。 IBM技术支持在诊断此类问题时也可能非常有帮助。不要害怕与他们联系,因为软件支持通常包含在维护合同中,与他们交谈无需付费。 我已经看到OLEDB连接占用了100%的cpu数小时,并且当通过VisualExplain(查询分析器)运行相同的查询时,它估计只需执行几秒钟。     
        我们发现运行像这样的查询执行起来像预期的那样:
SELECT *
FROM OpenQuery( LinkedServer,
    \'select count(*) 
    from transactions
    where processed = \'\'In process\'\'\')
GO
    
        这可能是整理问题吗? -您的“ 8”子句正在文本字段上进行测试,如果两个服务器的排序规则不匹配,则此子句将在客户端而不是在服务器端应用,因此,您首先将所有的1.7亿条记录拉到客户端,然后执行那里的“ 8”子句。     
        根据我过去的互动,无论您如何访问数据,查询都将花费相同的时间。另一个想法是,是否可以在表上创建视图以获取所需的数据或使用存储过程。     

要回复问题请先登录注册