SQL多表-非常慢

时间:2018-07-04 15:58:06

标签: sql database db2-400

我正在尝试为我的销售部门整理有关IBM OS / 400操作系统的SQL Server报告。

我的一位同事(离开公司)做了此报告,并使用了大量的子选择。

该报告通常需要大约30分钟来处理,并且往往只是无法显示。我已经尝试过切出一些表格/行,以期希望能成功完成整个过程(销售部门需要这一切)。

它处理所有相关数据(订单,客户,商品,我们在制造商处的订单,制造商等)。有什么想法吗?

由于OS / 400系统,我无法对其进行索引;猜想这对我们的承包商将是一项新的编程任务,从而导致成本上升。

我可以使用一些巧妙的联接吗?或以某种方式减少子选择的数量?

2 个答案:

答案 0 :(得分:1)

您在查询中使用4个零件名称吗?那可能是你的问题...

从SQL Server ...

-将表中的所有行拉回到MS SQL Server并在MS SQL Server上本地执行
select * from LINKEDSVR.MYIBMI.MYLIB.MYTBL where locnbr = '00335';

-将语句发送到IBM i服务器进行处理,仅返回结果。 select * from openquery(LINKEDSVR, 'select * from MYTBL where locnbr = ''00335''');

答案 1 :(得分:0)

尝试先运行子选择,然后将每个子选择的输出发送到自己的表中。

更新表上的统计信息。然后运行其余的SQL,用第一步中创建的表替换原来的子选择。

以相同的方式处理多层嵌套:每一层都是自己插入另一个表中。

我发现查询优化器很难使用复杂的SQL。将子查询分解为单独的步骤通常可以解决此问题。

在运行之间,我的首选是保留完整的数据作为参考,以防需要调试,然后将表截断作为运行的第一步。

回应橡皮擦的评论

假设原始查询采用以下一般形式:

select [columns] from 
(-- subquery
    select [columns] from TableA
) as Subquery
from TableB
where mainquery_where_clause

重写:

-- Create a table to handle results for your subquery:
Create Table A ;

-- Update the data distribution statistics:
update stats (TableA) ;

-- Now run the subquery:
insert into SubQTable select [columns] from TableA

-- Now run the re-written main query:
Select [columns]
from TableA, TableB
where TableA.joincol = TableB.joincol
and mainquery_where_clause ;

我注意到您发布的SQL的一些语法问题。看起来有些东西遗漏了。但我的回答原则仍然相同。请注意,应用我的建议可能无济于事,因为您的方案可能存在很多变数。您提到了子查询,所以我选择解决这个问题。

Halfer的建议是一个很好的建议:编辑您的原始问题,添加SQL代码,并将其放入文本编辑工具提供的“ {}”中。

我强烈建议您获取SQL execution plan并发布结果。

相关问题