大家来看看,关于 CROSS JOIN 优化的问题!

景色 2014-01-22 05:23:24
WITH TB AS
(
SELECT
A.Col1,
A.Col2,
DT
FROM A WITH(NOLOCK)
CROSS JOIN SELECT CONVERT(VARCHAR(10),DATEADD(DD,Number,'20140325'),112) AS DT FROM master..SPT_VALUES WHERE Type='P' AND DATEADD(DD,Number,'20140325')<='20140325') D
)

SELECT
TB.Col1,
TB.Col2,
B.Col3,
B.Col4,
C.Col5,
C.Col6,
FROM TB
LEFT JOIN B WITH(NOLOCK) ON B.Col1=TB.Col1 AND B.Col2=TB.Col2 AND B.DT=TB.DT
LEFT JOIN C WITH(NOLOCK) ON C.Col1=TB.Col1 AND C.Col2=TB.Col2 AND C.DT=TB.DT
WHERE TB.Col1 IN ('CHAR1','CHAR2','CHAR3','CHAR4','CHAR5')
group by TB.Col1, TB.Col2
order by TB.Col1, TB.Col2

上面的脚本的大意,如果不带 CROSS JOIN 执行很快,加了 CROSS JOIN 就非常慢!CPU 增加20%,大家有没有遇到过,有没有好的解决方案!
...全文
658 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2014-01-23
  • 打赏
  • 举报
回复
你这个貌似用right join就可以了吧?不一定要用cross join,另外你可以自己弄个日期表,不一定要动态生成
shoppo0505 2014-01-22
  • 打赏
  • 举报
回复
这个可能和我的问题一样了。详情见此帖: http://bbs.csdn.net/topics/390698376 CTE的结果集是没有index的,你可以试试建立一个带有index的临时表,将CTE的结果集存入临时表,然后再和后面的表一起做操作。
LongRui888 2014-01-22
  • 打赏
  • 举报
回复
这种cross join很难优化的,因为是笛卡尔积,也就是5条记录*5条记录,就是25条记录。
發糞塗牆 2014-01-22
  • 打赏
  • 举报
回复
cross join一般不应该出现在正式应用中啊,如果非要优化,只能减少两个数据集的数量

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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