- 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 bsowhere prl.line_location_id=pda.line_location_idand pda.po_line_id=pla.po_line_idand wo.operation_seq_num=wor.operation_seq_numand wo.wip_entity_id=wor.wip_entity_idand wo.organization_id=wor.organization_idand wo.department_id=bso.department_idand wo.description=bso.operation_descriptionand wo.organization_id=bso.organization_idand wor.wip_entity_id=prl.wip_entity_idand pda.wip_operation_seq_num=wor.operation_seq_numand wor.wip_entity_id=wdj.wip_entity_idand wor.organization_id=wdj.organization_idand wdj.status_type in(3,6)and wor.autocharge_type=4and 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重工')
中的子查询先处理到临时表中,再来联接查询,这样要检索的数据要小得多
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
不优化不行啊。
------解决方案--------------------------------------------------------
1.这个SQL看起来太累了吧,你那么多的条件,多做几次子查询,效率就会快很多了。当然这种只是简单的处 理,只能将效率提高很多,但代码段会增加。
2.最好的还是用iner join、left join来进行相应的连接。然后查询就快了。当然如果数据量太大的话。
3.也可以考虑用存储过程,毕竟exec一个存储过程比表要快很多很多。
------解决方案--------------------------------------------------------
亲。。请用视图+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