oracle联合查询优化问题

ascendlin 2011-12-28 03:21:56
假设:(只是假设)
现在比如我有三张表test1 ,test2,test3
create table test1(
id number primary key,
name1 varchar2(20),
t_test2_id number foreign key--------指向test2
)
create table test2(
id number primary key,
name2 varchar2(20),
t_test3_id number foreign key--------指向test3
)
create table test3(
id number primary key,
name3 varchar2(20)
)





我现在需要每个表中的name*那个字段,并且排除表2中的一些记录,比如id为1,3,5,7,9,10这些的。

直接用
select t1.id,t1.name1,t2.name2,t3.name3
from test1 t1,test2 t2,test3,t3
where t1.t_test2_id = t2.id and t2.t_test3_id = t3.id and t2.id not in(1,3,5,7,9,10);


这样貌似很低的效率,假设数据量过千万
...全文
106 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ascendlin 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yin_slin 的回复:]

如果有数千万,比如t1、t2、t3都有1千万,那你这样查出来的数据可就有1000万 * 100万(除掉部分数据,假定剩下100万) * 1000万的数据量了,你真的需要这么多数据?如果真的需要,那这个查询效率很高了,优化余地不大,如果不需要这么多,最好在应用程序中优化,尽量减轻数据库的压力。
[/Quote]我是打比方,实际中还没遇到,但是可能会遇到,所以来请教下大家
密码测试 2011-12-28
  • 打赏
  • 举报
回复
如果有数千万,比如t1、t2、t3都有1千万,那你这样查出来的数据可就有1000万 * 100万(除掉部分数据,假定剩下100万) * 1000万的数据量了,你真的需要这么多数据?如果真的需要,那这个查询效率很高了,优化余地不大,如果不需要这么多,最好在应用程序中优化,尽量减轻数据库的压力。
dntg007 2011-12-28
  • 打赏
  • 举报
回复
最好还是在应用程序中处理,数据库超作都只做单表查询就够了。
ascendlin 2011-12-28
  • 打赏
  • 举报
回复
难道就米什么好的方法了
ascendlin 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dntg007 的回复:]

不是很了解。直觉上。应该把最后一个条件放到最前,并且t2.id换成t1.t_test2_id。
where t1.t_test2_id not in(1,3,5,7,9,10) and t1.t_test2_id = t2.id and t2.t_test3_id = t3.id。
从执行顺序上,应该先遍历t1表,遍历时,第一个条件能否定的就应该不会再执行后面的条件,只是自己瞎猜的。
从实……
[/Quote]你的意思是分开查...
maliang18 2011-12-28
  • 打赏
  • 举报
回复
执行顺序不是从下到上么?
说实话,sql本身不觉得能够优化了,
要不你就做个视图
dntg007 2011-12-28
  • 打赏
  • 举报
回复
不是很了解。直觉上。应该把最后一个条件放到最前,并且t2.id换成t1.t_test2_id。
where t1.t_test2_id not in(1,3,5,7,9,10) and t1.t_test2_id = t2.id and t2.t_test3_id = t3.id。
从执行顺序上,应该先遍历t1表,遍历时,第一个条件能否定的就应该不会再执行后面的条件,只是自己瞎猜的。
从实际运行角度而言,最好做成3个检索。t1表条件检索,t2表条件检索,t3表全检索。然后其他处理可放到程序中来做。将t2,t3表的数据做成map。运行速度也不会太差。这样数据库的负担也能少些。

81,094

社区成员

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

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