Left Join与INNER Join执行效率对比.为什么Left Join跟INNER Join的差别很大,下图是他们的执行计划比对,望高手解决下

liangyong1107 2012-03-28 04:31:40

/*
功能说明: 创建测试
修改说明: Create by LY on 2011-09-11
*/
IF EXISTS (SELECT 1
FROM SYSOBJECTS
WHERE id = OBJECT_ID('Fact_SaleCar')
AND type = 'U')
BEGIN
DROP TABLE Fact_SaleCar
END
GO
CREATE TABLE [dbo].Fact_SaleCar
(
SaleCarId VARCHAR(20) NOT NULL,
SaleName VARCHAR(50) NULL,
CheckOutDate DATETIME NULL,
Price Float NULL
CONSTRAINT PK_Fact_SaleCar PRIMARY key (SaleCarId)
);
GO

BEGIN
/*
功能说明: 用循环加入测试数据
修改说明: Create by LY on 2011-09-11
*/

DECLARE @NUM INT;
SET @NUM=1;

/*------- 【20万条】---- */
WHILE @NUM <= 100000
BEGIN
INSERT INTO dbo.Fact_SaleCar
SELECT '商店'+RTRIM(@NUM),'SSS'+RTRIM(@NUM),GETDATE(),@NUM;
SET @NUM=@NUM+1;
END;
END;


SELECT A.SaleCarId,
Sum(Price)AS Price
FROM Fact_SaleCar A
INNER JOIN (SELECT Max(CheckoutDate) AS CheckoutDate,
SaleCarId
FROM Fact_SaleCar B
GROUP BY SaleCarId) C
ON A.SaleCarId = C.SaleCarId
AND A. CheckoutDate = C.CheckoutDate
GROUP BY A.SaleCarId

SELECT A.SaleCarId,
Sum(Price)AS Price
FROM Fact_SaleCar A
LEFT JOIN (SELECT Max(CheckoutDate) AS CheckoutDate,
SaleCarId
FROM Fact_SaleCar B
GROUP BY SaleCarId) C
ON A.SaleCarId = C.SaleCarId
AND A. CheckoutDate = C.CheckoutDate
GROUP BY A.SaleCarId


...全文
27287 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ryjgttrg 2014-10-13
  • 打赏
  • 举报
回复
我最近有一个SQL语句用left join 只要1s 用inner join 要1min多 都不知道为什么 郁闷死了
欢乐的尼美 2014-04-17
  • 打赏
  • 举报
回复
你数据量小,所以left join快,你弄500万条数据看看,保证inner join块
马云会下蛋 2013-11-20
  • 打赏
  • 举报
回复
2楼 是正确的 left join比一般表连接产生的逻辑读 大很多
  • 打赏
  • 举报
回复
引用 5 楼 wukaiping870123 的回复:
到底怎么说?
7基本说到点子了,另外可以见 http://bbs.csdn.net/topics/390411963
专注or全面 2013-04-01
  • 打赏
  • 举报
回复
left join实际上没有执行,直接执行
SELECT A.SaleCarId,
       Sum(Price)AS Price
FROM   Fact_SaleCar A
这样一个统计,因为统计信息并没有收到left表的影响 这里有没有left join 执行计划是一样的,inner join时就强制执行了一次合并连接
专注or全面 2013-04-01
  • 打赏
  • 举报
回复
这里的join是没有意义的吧?
火星大能猫 2013-04-01
  • 打赏
  • 举报
回复
到底怎么说?
dovei 2012-03-30
  • 打赏
  • 举报
回复
#2 你误人子弟啊
liangyong1107 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
left join 时系统做的逻辑运算量大于inner join

确认了一下,以上观点正确。但是是在相同的关联条件下。

个人觉得是因为这么一回事:
inner join 只需选出能匹配的记录
left join 不仅需要选出能匹配的,而且还要返回左表不能匹配的,所以多出了
这一部分逻辑运算
[/Quote]
按这样说的话,INNER JOIN效率应该高些呀。。但是结果显示LEFT JOIN的效率更快。
  • 打赏
  • 举报
回复
left join 时系统做的逻辑运算量大于inner join

确认了一下,以上观点正确。但是是在相同的关联条件下。

个人觉得是因为这么一回事:
inner join 只需选出能匹配的记录
left join 不仅需要选出能匹配的,而且还要返回左表不能匹配的,所以多出了
这一部分逻辑运算

22,209

社区成员

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

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