日期:2014-05-17  浏览次数:20471 次

SQL優化
SQL code
select 
wdj.wip_entity_id,
wdj.organization_id,
wdj.primary_item_id,
bso.operation_code
,sum(prl.quantity_delivered*pla.unit_price) ,sum(prl.quantity*pla.unit_price)
from  
po.po_requisition_lines_all prl,
po.po_distributions_all pda,       
po.po_lines_all pla,  
wip.WIP_OPERATION_RESOURCES wor ,
wip.wip_discrete_jobs wdj,
wip.wip_operations wo,
bom.bom_standard_operations bso
where 
prl.line_location_id=pda.line_location_id
and  pda.po_line_id=pla.po_line_id
and wo.operation_seq_num=wor.operation_seq_num
and wo.wip_entity_id=wor.wip_entity_id
and wo.organization_id=wor.organization_id
and wo.department_id=bso.department_id
and wo.description=bso.operation_description
and wo.organization_id=bso.organization_id
and wor.wip_entity_id=prl.wip_entity_id
and pda.wip_operation_seq_num=wor.operation_seq_num
and wor.wip_entity_id=wdj.wip_entity_id
and wor.organization_id=wdj.organization_id
and wdj.status_type in(3,6)
and wor.autocharge_type=4
and wdj.class_code in ('TJ1補料','TJ1重工','TJ2補料','TJ2重工') 
group by  wdj.wip_entity_id,wdj.primary_item_id,wdj.organization_id ,bso.operation_code


現在跑出來要一分鐘左右,
高手給看一下如何優化一下。

------解决方案--------------------
笛卡尔积是很“扯淡”的。

尽管sql server数据库会自动对笛卡尔积做优化,但是有点基础的程序员,应该写 inner join, left join 等关联语句,而不是这种。

写成iner join、left join之后,你可以看看每一个表达式右边的那个字段,有没有索引。如果没有,那么通常就要加上索引。
------解决方案--------------------
我敢打赌,在一个正规产品中sql语句中写笛卡尔积的程序员,没有上过学。
------解决方案--------------------
楼主的code是sql2000的吧?2005以后就不这么用了。
就像1楼说的尽量使用join进行关联,where中的条件也尽量在关联的时候就限定,表格大的话,会快很多。越大越明显。
------解决方案--------------------
用 left join 在form 后面进连接吧
------解决方案--------------------
先将and wdj.class_code in ('TJ1補料','TJ1重工','TJ2補料','TJ2重工') 
中的子查询先处理到临时表中,再来联接查询,这样要检索的数据要小得多
------解决方案--------------------
探讨

笛卡尔积是很“扯淡”的。

尽管sql server数据库会自动对笛卡尔积做优化,但是有点基础的程序员,应该写 inner join, left join 等关联语句,而不是这种。

写成iner join、left join之后,你可以看看每一个表达式右边的那个字段,有没有索引。如果没有,那么通常就要加上索引。

------解决方案--------------------
不优化不行啊。
------解决方案--------------------
1.这个SQL看起来太累了吧,你那么多的条件,多做几次子查询,效率就会快很多了。当然这种只是简单的处 理,只能将效率提高很多,但代码段会增加。

2.最好的还是用iner join、left join来进行相应的连接。然后查询就快了。当然如果数据量太大的话。

3.也可以考虑用存储过程,毕竟exec一个存储过程比表要快很多很多。
------解决方案--------------------
亲。。请用视图+left/right join
------解决方案--------------------
探讨

亲。。请用视图+left/right join

------解决方案--------------------
LZ, 你这SQL语句不好维护啊
------解决方案--------------------
用 连接(左联,右联) 把条件放在连接条件上 试试看!
------解决方案--------------------
select 
wdj.wip_entity_id,
wdj.organization_id,
wdj.primary_item_id,
bso.operation_code
,sum(prl.quantity_delivered*pla.unit_price) ,sum(prl.quantity*pla.unit_price)
from
po.po_requisition_lines_all prl 
left join wip.wip_discrete_jobs wdj 
on prl.XXX=wdj.XXX
left join bom_standard_operations bso 
onprl.XX=bso.XX
where 

group by