我正在尝试为我的销售部门整理有关IBM OS / 400操作系统的SQL Server报告。
我的一位同事(离开公司)做了此报告,并使用了大量的子选择。
该报告通常需要大约30分钟来处理,并且往往只是无法显示。我已经尝试过切出一些表格/行,以期希望能成功完成整个过程(销售部门需要这一切)。
它处理所有相关数据(订单,客户,商品,我们在制造商处的订单,制造商等)。有什么想法吗?
由于OS / 400系统,我无法对其进行索引;猜想这对我们的承包商将是一项新的编程任务,从而导致成本上升。
我可以使用一些巧妙的联接吗?或以某种方式减少子选择的数量?
答案 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并发布结果。