多表关联inner join优化问题

jett 2002-08-14 03:08:44
假设我有A,B,C3张表需要关联
sql为 select * from a,b,c where A.ID=B.ID and A.ID=C.ID
假设A,B两张表很大,而C很小。我希望A,C两表先关联然后再与B表关联
这样要比先A,B关联再C关联速度快得多 ,
但实际上sql server经常还是会先ab关联再关联c(在query analyzer 里的estimated execution plan可以看到)
即使我这么写
select * from
(select a.id from a,c where A.ID=C.ID)x inner join b on b.id=x.id
也没用
有什么其它办法吗(我不太想再用一个临时表,因为占资源)
...全文
724 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jett 2002-09-20
  • 打赏
  • 举报
回复
我猜想可能是因为在存储过程里有临时表时数据库不能估计出临时表的大小,所以优化的时候不一定可以做到让相对较小的临时表先与其它表关联,而会先让一些大表关联,效率就会变差
结贴了~~~
WeiXuBin 2002-09-04
  • 打赏
  • 举报
回复
哪种效率更高?
jett 2002-08-17
  • 打赏
  • 举报
回复
我发现如果sql比较复杂,关联的又是几个大表(10万几)可能优化不一定可靠,特别是from子句里有视图,临时表的情况
mtdata 2002-08-17
  • 打赏
  • 举报
回复
我觉得cyberwizard() 说的很有道理
如果是这样的语句:select * from a inner join c on a.id=c.id inner join b on c.id=b.id
那么就达到了先a,c连接,然后再和b连接的效果,理论上应该比where要优化一些,实际上,执行计划我测是一样的(在这种情况下)
cyberwizard 2002-08-17
  • 打赏
  • 举报
回复
select * from a
inner join b on a.id=b.id
inner join c on b.id=c.id
不就是先A和B连接,然后再和C连接吗?
我关注楼长的问题!!
zhujiechang 2002-08-16
  • 打赏
  • 举报
回复
在数据是以十万计算的话呢?我还是比较相信它的优化的。
dgz01 2002-08-16
  • 打赏
  • 举报
回复
up

*****
打工好辛苦
*****
钞票好难赚
*****
编程好伤神
*****
光阴好易混
*****
jett 2002-08-14
  • 打赏
  • 举报
回复
To Yang_(扬帆破浪) 实际上我那个c表是临时表,而且a,b,c都是有索引的
我是这么试的
insert into c select .....
select * from a,b,c where A.ID=B.ID and A.ID=C.ID
一次是先insert 再分析select
一次是insert,select放在一起分析,2次做出的结果不一样
而且如果把它做在一个存储过程里感觉执行的过程和第2次的一样

你说的option似乎很有用我先去看看
caiyunxia 2002-08-14
  • 打赏
  • 举报
回复
原则上应将返回记录小的连接放在前面
Yang_ 2002-08-14
  • 打赏
  • 举报
回复
一定要调整的话,可以加选项,但结果不一定最优。

select * from a,b,c where a.id=b.id
and b.id=c.id AND A.ID=C.ID
OPTION (FAST 1)

其中OPTION ()里可以有很多选项,具体看联机帮助!
Yang_ 2002-08-14
  • 打赏
  • 举报
回复
你怎么试的?

我在sql 2000下,a 表1000行,b表10000行,c表10行,无论我写
select * from a,b,c where c.id=a.id
and c.id=b.id

or:
select * from a,b,c where a.id=b.id
and a.id=c.id

or:
select * from a,b,c where a.id=b.id
and b.id=c.id

执行计划都是先连接a,c再连接b

我想有个概念必须先搞清楚:
行数多并不代表连接速度慢,这个和所因还有关系,和数据也有关系。
自动优化还是在大部分情况下应该相信的。

j9988 2002-08-14
  • 打赏
  • 举报
回复
加入收藏

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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