SQL SERVER 中对于内外联接(join,left join,right join.....)等的实现过程是怎么样的啊,高人请指点一下!!!

eping2002 2008-06-20 03:49:08
SQL SERVER 中对于内外联接(join,left join,right join.....)等的实现过程是怎么样的啊,高人请指点一下!!!

是不是想有些人说的先笛卡儿积后再按条件选出行来?
...全文
398 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
eping2002 2008-06-26
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 Leedsema 的回复:]
你们知道不知道。
SELECT * FROM TabA A INNER JOIN TabB B ON A.ID_=B.ID_

SELECT * FROM TabA A ,TabB B WHERE A.ID_=B.ID_
的区别?先搞清楚这个再来说联接的事吧
[/Quote]

这位来给出个答案啊,指教一下啊
eping2002 2008-06-24
  • 打赏
  • 举报
回复
我有过一次经历,我生成了一个600W条记录的数据库,然后测试几个分页存储过程,环境是XP下我用的虚拟机,装了个2003,上边安装的SQL SERVER2005 ,数据库建成后,在建产索引时,死活建不了,可以是虚拟机的硬件没有设够,建索引时,老报错,后来,我在这种条件下测试一个分页存储过程,其中用了几条多表(#表)子语句的查询,结果查这数据库,硬是在我睡前到天亮醒来都没有完成,最后我查了一下,是硬盘空间被用光了,我估计是不是Merge Join 实现,他在给出表建索引,但索引又建不了,所以,造成空等待
happysophie 2008-06-24
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 eping2002 的回复:]
引用 24 楼 wgzaaa 的回复:
既然是联接的内部机制,我们又没法控制,它再差也比in强吧,能不用join?


不是在JOIN前加相关的前缀就能让按指定的方法来实现吗!!!不知我理解的对不
[/Quote]
好像是这样的,sql会根据表的情况选择最优的方法实现join。

还有,20楼的说法我,我也太明白,能不能给大家讲解一下!
eping2002 2008-06-24
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 wgzaaa 的回复:]
既然是联接的内部机制,我们又没法控制,它再差也比in强吧,能不用join?
[/Quote]

不是在JOIN前加相关的前缀就能让按指定的方法来实现吗!!!不知我理解的对不
wgzaaa 2008-06-24
  • 打赏
  • 举报
回复
既然是联接的内部机制,我们又没法控制,它再差也比in强吧,能不用join?
eping2002 2008-06-24
  • 打赏
  • 举报
回复
这几天查了一下资料,首先查了一下SQL SERVER 联接时用的常用三种方法Hash Join (哈希联结),Nested Loop Join (嵌套循环联结),Merge Join (排序合并联结,SQL SERVER内外联系会自动根据情况选择一种最优化的法师来执行,
,HASH一般用在两表都未排序,较大,两边都有重复值时,SQL SERVER优化器最后选择的一种方法,NESTED LOOP一般用在一大一小的表,且其中有一个表的JOIN字段有唯一值,内表最好有索引的情况下,效果会很好,Merge一般用在表的大小都差不多,而且两表的JOIN字段都排序完成的情况下最好,

总体来说,这几种方法在最坏的情况时,有可能执要花费笛卡尔积的性能,蛤也不是我面试时说的那种情况,

至于leedsema说的20楼的情况,

我了解的可以认为后者是联接的前身形式吧,至于执行的原理应该也是类似的步骤吧,这只是我的认为,呵呵,

还请Leedsema详细说一下区别,那位高手能熟细的来说说啊,
ChinaJiaBing 2008-06-23
  • 打赏
  • 举报
回复
楼主说的很正确...................
zhiguo2008 2008-06-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liangCK 的回复:]
SQL code--测试数据
DECLARE @a TABLE(id int)
INSERT @a SELECT 1
UNION ALL SELECT 2

DECLARE @b TABLE(id int)
INSERT @b SELECT 2
UNION ALL SELECT 3

--内联接
SELECT * FROM @a a JOIN @b b ON a.id=b.id
SELECT * FROM @a a,@b b WHERE a.id=b.id
/*--结果(只返回两个表中id相同的记录)
id id
---------------- -----------
2 2
--*/

学习一下

--左向外联接
SELECT * FROM @a a LEFT J…
[/Quote]
「已注销」 2008-06-23
  • 打赏
  • 举报
回复
你们知道不知道。
SELECT * FROM TabA A INNER JOIN TabB B ON A.ID_=B.ID_

SELECT * FROM TabA A ,TabB B WHERE A.ID_=B.ID_
的区别?先搞清楚这个再来说联接的事吧
ruihuahan 2008-06-23
  • 打赏
  • 举报
回复
可以查看一下执行计划。

join 的物理实现,如 7 楼所述,分为三种

nested loops join , merge join 和 hash join。

具体原理,楼主可以参考相关资料。
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liangCK 的回复:]
SQL code--测试数据
DECLARE @a TABLE(id int)
INSERT @a SELECT 1
UNION ALL SELECT 2

DECLARE @b TABLE(id int)
INSERT @b SELECT 2
UNION ALL SELECT 3

--内联接
SELECT * FROM @a a JOIN @b b ON a.id=b.id
SELECT * FROM @a a,@b b WHERE a.id=b.id
/*--结果(只返回两个表中id相同的记录)
id id
---------------- -----------
2 2
--*/

--左向外联接
SELECT * FROM @a a LEFT J…
[/Quote]
//小梁mm就是厉害啊,学习...
Garnett_KG 2008-06-23
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 eping2002 的回复:]


呵呵,我只是在面试时,当谈到联接时,对方大谈性能方面的影响,说内联在ON条件以前,数据会以笛卡儿积提取出来,然后再按ON的条件把最终结果取出来,由于我没有看过这方面的资料,但感觉又不…
[/Quote]

去他的 !

LOOP JOIN 、MERGE JOIN 、HASH JOIN之间没有谁好谁坏的区别!
看是在什么场合,小数据量就是loop join 和merge join ,但merge join 要求输入的数据要有排序,
loop join 不消耗内存。
超大数据连接时,采用的就是hash join ,消耗内存严重,有可能会使用temp db。

wgzaaa 2008-06-23
  • 打赏
  • 举报
回复
on条件中非连接(我指的是对单一表的条件)条件并非都在联接之后过滤条件,尤其是内联是首先过滤对单一表的条件经(如对A表的条件与对B的条件或两条件的组合),这在查询分析器中的执行计划里可以查到。
eping2002 2008-06-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 Leedsema 的回复:]
楼主是在学习数据库原理,看来他是想自己开发一套汉字的SQL哦,将来,我们写SQL语句是这样的,
选取字段一,字段二 从 表一联接到表二 条件是 七七八八 按九九十十排序
全世界为汗字疯狂!!!
[/Quote]

呵呵,我只是在面试时,当谈到联接时,对方大谈性能方面的影响,说内联在ON条件以前,数据会以笛卡儿积提取出来,然后再按ON的条件把最终结果取出来,由于我没有看过这方面的资料,但感觉又不可能是这样,我只能说,我不太了解实现原理,但我对你的观点我持保留态度。
所以,回来我就查资料,顺便发个贴子让高人指点一下!!!

这几天网不好,谢谢大家的指点,我去看看这方面的资料 希望大家多谈自已的观点,
being21 2008-06-20
  • 打赏
  • 举报
回复
呵呵 邹建 新书 里面 讲了 一下,偶看了又忘记了。你可以去看看啊!
wgzaaa 2008-06-20
  • 打赏
  • 举报
回复
如果只是关注条件在何时先过滤:
join  先过滤两边表再连接(按条件匹配),
---(过滤指对某个表单独的条件如 table1.col1>100 and table2.col2='abc')
left join 先过滤右边表再连接(如 table2.col2='abc')
right join 先过滤左边表再连接(如 table1.col1>100 )
full join 先连接(按条件匹配)后过滤
cross join 先过滤两边表再连接
中国风 2008-06-20
  • 打赏
  • 举报
回复
看聯機幫助和說明和例子

選擇—索引—輸入"from 子句"—選擇"關於from子句"
「已注销」 2008-06-20
  • 打赏
  • 举报
回复
楼主是在学习数据库原理,看来他是想自己开发一套汉字的SQL哦,将来,我们写SQL语句是这样的,
选取字段一,字段二 从 表一联接到表二 条件是 七七八八 按九九十十排序
全世界为汗字疯狂!!!
懒牛科技 2008-06-20
  • 打赏
  • 举报
回复
楼主想了解它的原理?
fuda_1985 2008-06-20
  • 打赏
  • 举报
回复
mark
加载更多回复(8)

34,837

社区成员

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

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