SQL優化

arecaiz 2012-06-22 01:37:08
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


現在跑出來要一分鐘左右,
高手給看一下如何優化一下。
...全文
221 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhulong1111 2012-06-26
  • 打赏
  • 举报
回复
亲。。请用视图+left/right join
这一站_IT 2012-06-26
  • 打赏
  • 举报
回复
1.这个SQL看起来太累了吧,你那么多的条件,多做几次子查询,效率就会快很多了。当然这种只是简单的处 理,只能将效率提高很多,但代码段会增加。

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

3.也可以考虑用存储过程,毕竟exec一个存储过程比表要快很多很多。
Jack123 2012-06-26
  • 打赏
  • 举报
回复
不优化不行啊。
qxyywy 2012-06-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

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

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

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

虽然P哥常批评人 但这次楼主的SQL写法真的该被P个批

你的class_code的长度是多少 建议对这个字段建立索引
arecaiz 2012-06-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

先将and wdj.class_code in ('TJ1補料','TJ1重工','TJ2補料','TJ2重工')
中的子查询先处理到临时表中,再来联接查询,这样要检索的数据要小得多
[/Quote]

這個已經做過,效果不大。
主要還是因為出現 笛卡尔积

這是Oracle ERP數據庫。
這個查詢只是我需求的一個子查詢。實際SQL要比這個多太太多了。一下粘不出所有SQL
那一笑的凄凉 2012-06-26
  • 打赏
  • 举报
回复
多楼主你这表查询写的真是...比如每张有50W以上的数据笛卡尔下来都不敢想象,难怪你会卡,你可以先分析要查询出什么,建议用left join on筛选数据,要查询的数据量有多大,分析每张表的数据,调整好表关联的顺序,尽量前面的关联就筛选出大部份无用的数据,where 条件也是前面的条件就过滤出大部分不符合条件的数据,具体方法自己根据表数据量多做测试了,写出一个最佳语句。
H_Gragon 2012-06-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
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_re……
[/Quote]
楼主真是人才啊!
Name_456 2012-06-26
  • 打赏
  • 举报
回复
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
IT修补匠 2012-06-26
  • 打赏
  • 举报
回复
用 连接(左联,右联) 把条件放在连接条件上 试试看!
No4000 2012-06-26
  • 打赏
  • 举报
回复
LZ, 你这SQL语句不好维护啊
yzf86211861 2012-06-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

亲。。请用视图+left/right join
[/Quote]
这是第1个。
把每组需要管理的字段加 非聚集索引
cs_esharp 2012-06-22
  • 打赏
  • 举报
回复
先将and wdj.class_code in ('TJ1補料','TJ1重工','TJ2補料','TJ2重工')
中的子查询先处理到临时表中,再来联接查询,这样要检索的数据要小得多
csdn_风中雪狼 2012-06-22
  • 打赏
  • 举报
回复
用 left join 在form 后面进连接吧
shoppo0505 2012-06-22
  • 打赏
  • 举报
回复
楼主的code是sql2000的吧?2005以后就不这么用了。
就像1楼说的尽量使用join进行关联,where中的条件也尽量在关联的时候就限定,表格大的话,会快很多。越大越明显。
  • 打赏
  • 举报
回复
我敢打赌,在一个正规产品中sql语句中写笛卡尔积的程序员,没有上过学。
  • 打赏
  • 举报
回复
笛卡尔积是很“扯淡”的。

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

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

62,073

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧