多表关联的问题

jiggerli 2005-06-22 09:12:05
如今我遇到一个大问题,请教各位朋友。
有个SQL,涉及到4个表关联,管理数据库的工程师告诉我执行我那SQL后遍历过1000多万条记录,即使在怎么优化也到在这个值左右,现我想把4个表关联改为每2个表关联,然后用程序里再把进行组合符合条件的记录,却又发现这个双循环的工作量很大,30万*1万(这2个数随数据库记录的增加而增加);请问各位高手,你们遇到多表关联的程序,是怎么解决的呢?
...全文
277 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengmingjie 2005-06-28
  • 打赏
  • 举报
回复
把in语句改成or的连接,可以考虑用视图来实现吧(个人认为)
jiggerli 2005-06-28
  • 打赏
  • 举报
回复
谢谢各位的解答,我查过SQL优化的资料,对表进行了优化,还有我也把临时表f和其他表分开,临时表查找后的数据用LinkedList()保存起来,其他表的查询也一样,然后用程序来实现它们间的关联,这样给数据库带的遍历减少很多,只是在程序里增加些负担,速度快多了。
zzb23 2005-06-27
  • 打赏
  • 举报
回复
(select e.p_sid,b.p_state,c.p_psnum,c.p_panum,c.p_mbankid
from p_pss b,p_mccinfo c,p_sid e
where b.p_id=e.p_id
and b.p_id=c.p_id
and c.p_mbankid=b.p_mbankid
and b.p_state in ('01','03','04','05')
and (c.p_psnum is not null and c.p_pastate='00')) f
将表f建成一个临时表,使用时先生成这个临时表,在和这个表做关联,就可以省去很多的遍例了
可以用存储过程来实现临时表的生成与删除。
MSli 2005-06-24
  • 打赏
  • 举报
回复
select a.p_id,a.p_sid,a.p_cardid,a.p_bankid,f.p_state,f.p_psnum,f.p_panum
from (select p_id,p_sid,p_cardid,p_bankid from p_detail
where (p_state in ('01','04') and p_cardid is not null
and p_cardid not in (
select p_cardid from p_card where p_rec=1)
)) a,
p_card d,
(
select e.p_sid,b.p_state,c.p_psnum,c.p_panum,c.p_mbankid
from p_pss b,p_mccinfo c,p_sid e
where b.p_id=e.p_id and b.p_id=c.p_id and c.p_mbankid=b.p_mbankid
and b.p_state in ('01','03','04','05') and (c.p_psnum is not null and c.p_pastate='00')) f
where a.p_caardid=d.p_cardid and a.p_sid=f.p_sid and f.p_mbankid=d.p_bankid and d.p_rec=0 order by a.p_sid
yehy 2005-06-24
  • 打赏
  • 举报
回复
SQL语句太复杂了
lizzz 2005-06-24
  • 打赏
  • 举报
回复
个人认为,如果这个查询无法优化,那么为什么不从数据库的结构上进行调整呢(如果可以),例如增加冗余数据等。
jiggerli 2005-06-24
  • 打赏
  • 举报
回复
此贴马上要结,散分。若有哪位高手可以解决的话,分数全给他/她。
fashchina 2005-06-24
  • 打赏
  • 举报
回复
up
jxdn_yang 2005-06-24
  • 打赏
  • 举报
回复
select能不嵌套尽量不要嵌套。
但我觉得SELECT象狗皮膏药,百搭,而且是绝招,一般不轻易出手。。。。。嘻嘻
nighthawk 2005-06-24
  • 打赏
  • 举报
回复
in的效率非常低,能不用就尽量避免用。
select能不嵌套尽量不要嵌套。
这2个指导原则,会使你的sql快很多。找点sql优化的资料看看吧
jihanzhong 2005-06-24
  • 打赏
  • 举报
回复
有index的键先判断,速度会快很多,最好,连接关系的所有key都有index
yunxiang 2005-06-24
  • 打赏
  • 举报
回复
数据库一定是比程序运行要快的多。
要是用sql都不行。那么程序就不要向了。

单单从这语句没法看出问体。因为我们根本不知道你那张表的数据量多。。
要尽量避免多这样的表进行重复查询。或他们之间的连接。
jiggerli 2005-06-22
  • 打赏
  • 举报
回复
应该说5张表才对,大家请看看。
select a.p_id,a.p_sid,a.p_cardid,a.p_bankid,f.p_state,f.p_psnum,f.p_panum from p_detail a,p_card d, (select e.p_sid,b.p_state,c.p_psnum,c.p_panum,c.p_mbankid from p_pss b,p_mccinfo c,p_sid e where b.p_id=e.p_id and b.p_id=c.p_id and c.p_mbankid=b.p_mbankid and b.p_state in ('01','03','04','05')and (c.p_psnum is not null and c.p_pastate='00')) f where a.p_caardid=d.p_cardid and a.p_sid=f.p_sid and f.p_mbankid=d.p_bankid and (a.p_state in ('01','04') and a.p_cardid is not null and a.p_cardid not in (select p_cardid from p_card where p_rec=1)) and d.p_rec=0 order by a.p_sid
wozuibt 2005-06-22
  • 打赏
  • 举报
回复
把你的四张表贴出来看看,真的无法优化了吗?
jinxf 2005-06-22
  • 打赏
  • 举报
回复
up

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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