SQL優化SQL codeselect wdj.wip_entity_id,wdj.organization_id,wdj.primary_item_id,bso.operation_code,
SQL優化
SQL codeselect 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
[解决办法]
[解决办法]多楼主你这表查询写的真是...比如每张有50W以上的数据笛卡尔下来都不敢想象,难怪你会卡,你可以先分析要查询出什么,建议用left join on筛选数据,要查询的数据量有多大,分析每张表的数据,调整好表关联的顺序,尽量前面的关联就筛选出大部份无用的数据,where 条件也是前面的条件就过滤出大部分不符合条件的数据,具体方法自己根据表数据量多做测试了,写出一个最佳语句。