我正在尝试从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至少能够理解这种类型的查询。
答案 0 :(得分:3)
我不得不多次打这场战斗。
有两种方法可以解决这个问题。
1)将您的数据从AS400转移到SQL服务器,您可以在其中优化索引 2)要求AS400人员创建加速数据检索的逻辑视图,AS400程序员是正确的,索引会有所帮助,但我忘记了他们用来定义类似于sql server视图的“视图”的术语,我相信它的东西像“物理”v / s“逻辑”。逻辑就是你想要的。
第三,1.7亿是很多记录,即使是像SQL服务器这样的关系型数据库,你是否考虑过每晚运行一个SSIS包,将你的数据分段到你自己的SQL表中,看看它是否能提高性能?
答案 1 :(得分:2)
我建议这种方式有良好的表现,我想你至少有SQL2005
,我还没有测试过,但这是一个提示
让AS400通过在AS400中创建存储过程以本机方式执行选择
以这种方式创建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 SPdeclare @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)
根据我以前的交互情况,无论您如何访问数据,查询都需要大约相同的时间。另一个想法是,如果您可以在表上创建一个视图来获取所需的数据或使用存储过程。