cross join 效率问题

HHH3000 2009-09-16 10:22:16
由于需要补齐交叉数据,所以用到cross join, 但是cross join后高达8w多行数据,
效率也是一落千丈,请问有什么好办法解决这个效率问题么?或者有没有别的好方法做交叉数据补齐的?
...全文
493 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
SQL77 2009-09-16
  • 打赏
  • 举报
回复
就FULL JOIN
david0927cs2006 2009-09-16
  • 打赏
  • 举报
回复
学习学习
接分
htl258_Tony 2009-09-16
  • 打赏
  • 举报
回复
FULL JOIN应该能解决楼主的问题。
HHH3000 2009-09-16
  • 打赏
  • 举报
回复
解决了,下面我说一下问题所在
下面是查询语句结构:
select a.colum,b.colum,c.colum
from (... where xxx) a
cross join
(... where xxx) b
cross join
(... where xxx) c

子查询a,b,c的执行时间都是1秒

问题出在子查询c上面,子查询c的语句结构如下:
(select m.colum,n.colum from m
cross join n
where n.nnn=.... and m.mmm=...) c

表n和表m的nnn字段,mmm字段都有索引

现在增加子查询e和f,他们实际上就是表m和表n,与子查询c通过主键inner连接
将子查询c中的where条件拿出来,放到整个查询的where条件下,并将条件的所属表改为子查询e和f
47秒变1秒,下面是改后的语句结构:

select a.colum,b.colum,c.colum
from (... where xxx) a
cross join
(... where xxx) b
cross join
(select m.mid,n.nid from m
cross join n ) c
inner join
m on m.id=c.mid
inner join
n on n.id=c.nid
where n.nnn=.... and m.mmm=...

查询方面我算是个菜鸟,执行计划不会看,
不知道是不是笛卡尔积嵌套笛卡尔积在加条件会影响效率,
总之解决方法如上,如果有高人希望讲讲原理,谢谢
HHH3000 2009-09-16
  • 打赏
  • 举报
回复
回js_szy,引用错了,是你楼上的说的不太对
华夏小卒 2009-09-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hhh3000 的回复:]
引用 10 楼 js_szy 的回复:
a中的每一条记录都会与B中的所有记录,去匹配。
所以会产生m*n条记录


此言差矣,每个子查询的执行时间都在1秒内,联合起来就是47秒
[/Quote]

我说的不对?
guguda2008 2009-09-16
  • 打赏
  • 举报
回复
FULL JOIN ON A.ID=B.ID OR A.ID<>B.ID
试试
HHH3000 2009-09-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 js_szy 的回复:]
a中的每一条记录都会与B中的所有记录,去匹配。
所以会产生m*n条记录
[/Quote]

此言差矣,每个子查询的执行时间都在1秒内,联合起来就是47秒
xuejiecn 2009-09-16
  • 打赏
  • 举报
回复
如LZ所说,应该是查询A,B,C中的效率问题,与cross join无关。
华夏小卒 2009-09-16
  • 打赏
  • 举报
回复
a中的每一条记录都会与B中的所有记录,去匹配。
所以会产生m*n条记录
xuejiecn 2009-09-16
  • 打赏
  • 举报
回复
A cross join B 得到的结果就是A中的每一条与B中的所有记录组合得到的结果。
华夏小卒 2009-09-16
  • 打赏
  • 举报
回复
.
HHH3000 2009-09-16
  • 打赏
  • 举报
回复
下面是查询语句结构:
select a.colum,b.colum,c.colum
from (... where xxx) a
cross join
(... where xxx) b
cross join
(... where xxx) c

又试了试,去掉了a,b,c子查询中的一些where条件,查询效率猛增,对cross join的执行过程还是不甚了解
--小F-- 2009-09-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xuejiecn 的回复:]
引用 3 楼 fredrickhu 的回复:
cross join 应该也能加索引吧 连接字段/

cross join也可以有连接字段??
A cross join B
A有m条,b有n条,则结果有m*n条了
[/Quote]

这个我知道
xuejiecn 2009-09-16
  • 打赏
  • 举报
回复
补齐数据,一般 用外连接吧?
LZ说说你的情况,看有别的办法没?
xuejiecn 2009-09-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fredrickhu 的回复:]
cross join 应该也能加索引吧 连接字段/
[/Quote]
cross join也可以有连接字段??
A cross join B
A有m条,b有n条,则结果有m*n条了
--小F-- 2009-09-16
  • 打赏
  • 举报
回复
cross join 应该也能加索引吧 连接字段/
soft_wsx 2009-09-16
  • 打赏
  • 举报
回复
详细一点,8W也不多呀!
--小F-- 2009-09-16
  • 打赏
  • 举报
回复
2005试一下CROSS APPPLY

34,838

社区成员

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

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