关于oracle连接查询执行等待时间太长的问题(优化sql)

jianhongzhao 2010-08-12 01:46:14
最近给一家公司做一个oracle数据库的检索功能

select count(*) as zs,su.subjectname from ISTIC_Data_CSTPCD_Article ar,ISTIC_Dic_SubjectCode su,ISTIC_Data_CSTPCD_Citation ci
where ar.xk=su.SUBJECTCODE and ar.pdfurl=ci.zz1
group by su.subjectname

相信大家对这个sql语句并不陌生吧,该语句是三个表的连接查询,三个表的数据量分别为3405497,53,7727297。
其实我一开始只是对前两个表做连接查询,大概用了七秒钟就出现了结果。但是当将第三个表也连接上的时候,这个sql语句整整运行了一天也没运行出结果,我知道肯定很慢,但没想到会这么慢,希望各位高手指点,如何能过提高该sql语句的执行效率!
...全文
1429 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
minitoy 2010-08-12
  • 打赏
  • 举报
回复
没啥招了,这么简单的sql。。。
jianhongzhao 2010-08-12
  • 打赏
  • 举报
回复
39条
blue_maple 2010-08-12
  • 打赏
  • 举报
回复
你的没有过滤条件 所以 只有试试表按数据量排列ci,ar,su试试 应该有提高 不过不会太多
blue_maple 2010-08-12
  • 打赏
  • 举报
回复
3个表先后顺序:数据量最大->数据量次之->数据量最小 排列
查询条件把能过滤掉大量数据的条件放最后
简言之,多表连接表顺序从多到少,where条件 按过滤量从少到多
zhone 2010-08-12
  • 打赏
  • 举报
回复
是不是数据块老化了。把表移动到新的块,把索引重建,触发器重编译,再试试。
Alter table table_name move;
Alter index index_name rebuild;
Alter trigger trigger_name compare;
minitoy 2010-08-12
  • 打赏
  • 举报
回复
统计结果是多少条?
jianhongzhao 2010-08-12
  • 打赏
  • 举报
回复
6楼的方法执行时间也基本没有变化!不过仍然感谢你提供了一种思路,希望大家继续帮忙!!
minitoy 2010-08-12
  • 打赏
  • 举报
回复
数据量太大造成的

WITH t1 AS ( SELECT * from ISTIC_Data_CSTPCD_Article ar,ISTIC_Dic_SubjectCode su WHERE ar.xk=su.SUBJECTCODE )
select count(*) as zs,t1.subjectname FROM ISTIC_Data_CSTPCD_Citation ci ,t1
WHERE t1.pdfurl=ci.zz1
group by t1.subjectname
jianhongzhao 2010-08-12
  • 打赏
  • 举报
回复
按照四楼的对调了一下,执行时间没有变化。
  • 打赏
  • 举报
回复

select count(*) as zs,su.subjectname from ISTIC_Data_CSTPCD_Article ar,ISTIC_Dic_SubjectCode su,ISTIC_Data_CSTPCD_Citation ci
where ar.pdfurl=ci.zz1 and ar.xk=su.SUBJECTCODE
group by su.subjectname

试试
jianhongzhao 2010-08-12
  • 打赏
  • 举报
回复
恩,这次速度确实发生了质的变化,用了30秒,可是仍然感觉让客户用的话无法接受,还有其他更好的解决方案吗!!
minitoy 2010-08-12
  • 打赏
  • 举报
回复
恩,建索引看看,估计是全表扫描了
da21 2010-08-12
  • 打赏
  • 举报
回复
给ar.pdfurl,ci.zz1
这两个字段建个索引试试

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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