任务描述

1. 问题分析

    次问题为宋宇提交的慢sql优化问题,分析发现,2个子查询 大表,查询后在inner join ,分析器提示缺少索引,查询比较慢需25秒,


2.解决方案

A.优化后的sql ,将INNER JOIN 改为 EXISTS, 测试查询从25秒提高到1秒不到 ,已改造完成


B.此类问题可以参考将INNER JOIN 改为 EXISTS的方案,提高查询速度


--select count(0) from [RB_Product_Image] nolock  --40416416
--select count(0) from [RB_Product] nolock         --2190570

SELECT TOP 20 [Id]                AS [Id],
              [CustomerID]        AS [CustomerId],
              [SKU]               AS [Sku],
              [ImageUrl]          AS [Url],
              [ImageType]         AS [Type],
              [FileSize]          AS [FileSize],
              [Status]            AS [Status],
              [IsCover]           AS [IsMain],
              [IsSpareCover]      AS [IsSpareMain],
              [IsWhiteBackGround] AS [IsWhiteBackground],
              [IsFigure]          AS [IsAttach],
              [SortBy]            AS [Sort],
              [AddTime]           AS [AddTime]
FROM   [RB_Product_Image] i
WHERE  EXISTS (SELECT 1
               FROM   [RB_Product] p
               WHERE  i.sku = p.sku
                      AND p.[ImageUpdateTime] BETWEEN '2022-01-17 13:45:03' AND '2022-05-17 15:45:03') 


3.sql


SELECT
top 20
  * 
FROM
  (
  SELECT
    [i].[Id] AS [Id],
    [i].[CustomerId] AS [CustomerId],
    [i].[Sku] AS [Sku],
    [i].[Url] AS [Url],
    [i].[Type] AS [Type],
    [i].[FileSize] AS [FileSize],
    [i].[Status] AS [Status],
    [i].[IsMain] AS [IsMain],
    [i].[IsSpareMain] AS [IsSpareMain],
    [i].[IsWhiteBackground] AS [IsWhiteBackground],
    [i].[IsAttach] AS [IsAttach],
    [i].[Sort] AS [Sort],
    [i].[AddTime] AS [AddTime],
    [p].[UpdateTime] AS [UpdateTime] 
  FROM
    (
    SELECT
      [Id] AS [Id],
      [CustomerID] AS [CustomerId],
      [SKU] AS [Sku],
      [ImageUrl] AS [Url],
      [ImageType] AS [Type],
      [FileSize] AS [FileSize],
      [Status] AS [Status],
      [IsCover] AS [IsMain],
      [IsSpareCover] AS [IsSpareMain],
      [IsWhiteBackGround] AS [IsWhiteBackground],
      [IsFigure] AS [IsAttach],
      [SortBy] AS [Sort],
      [AddTime] AS [AddTime] 
    FROM
      [RB_Product_Image] WITH ( NOLOCK ) 
    WHERE
      ( [CustomerID] = 1 )  
    ) i
    INNER JOIN (
    SELECT
      [CustomerID] AS [CustomerID],
      [SKU] AS [SKU],
      [UpdateTime] AS [UpdateTime] 
    FROM
      [RB_Product] WITH ( NOLOCK ) 
    WHERE
      ( [CustomerID] = 1 ) 
      AND ( [ImageUpdateTime] BETWEEN '2022-05-17 13:45:03' AND '2022-05-17 15:45:03' ) 
    ) p ON ( ( [i].[CustomerId] = [p].[CustomerID] ) AND ( [i].[Sku] = [p].[SKU] ) ) 
  ) MergeTable 
ORDER BY
  Id ASC;

  --select count(0) from [RB_Product_Image] nolock  --40416416
  --select count(0) from [RB_Product] nolock         --2190570

历史记录  
  1. 2022-05-19 10:40:01, 由 陈少军 创建。
  2. 2022-05-19 10:41:24, 由 陈少军 编辑。
    修改了 任务名称,区别为:
    001- 【慢sql优化】
    001+ 【慢sql优化】查询 RB_Product_Image 性能优化,将INNER JOIN 改为 EXISTS 案例
    001- 【慢sql优化】
    001+ 【慢sql优化】查询 RB_Product_Image 性能优化,将INNER JOIN 改为 EXISTS 案例
    修改了 任务描述,区别为:
    005- A.优化后的sql ,将INNER JOIN 改为EXISTS, 测试查询从25秒提高到1秒不到
    005+ A.优化后的sql ,将INNER JOIN 改为EXISTS, 测试查询从25秒提高到1秒不到 ,已改造完成
    009- --select count(0) from [RB_Product_Image] nolock --40416416--select count(0) from [RB_Product] nolock --2190570SELECT TOP 20 [Id] AS [Id], [CustomerID] AS [CustomerId], [SKU] AS [Sku], [ImageUrl] AS [Url], [ImageType] AS [Type], [FileSize] AS [FileSize], [Status] AS [Status], [IsCover] AS [IsMain], [IsSpareCover] AS [IsSpareMain], [IsWhiteBackGround] AS [IsWhiteBackground], [IsFigure] AS [IsAttach], [SortBy] AS [Sort], [AddTime] AS [AddTime]FROM [RB_Product_Image] iWHERE EXISTS (SELECT 1 FROM [RB_Product] p WHERE i.sku = p.sku AND p.[ImageUpdateTime] BETWEEN '2022-01-17 13:45:03' AND '2022-05-17 15:45:03')
    009+ --select count(0) from [RB_Product_Image] nolock --40416416--select count(0) from [RB_Product] nolock --2190570SELECT TOP 20 [Id] AS [Id], [CustomerID] AS [CustomerId], [SKU] AS [Sku], [ImageUrl] AS [Url], [ImageType] AS [Type], [FileSize] AS [FileSize], [Status] AS [Status], [IsCover] AS [IsMain], [IsSpareCover] AS [IsSpareMain], [IsWhiteBackGround] AS [IsWhiteBackground], [IsFigure] AS [IsAttach], [SortBy] AS [Sort], [AddTime] AS [AddTime]FROM [RB_Product_Image] iWHERE EXISTS (SELECT 1 FROM [RB_Product] p WHERE i.sku = p.sku AND p.[ImageUpdateTime] BETWEEN '2022-01-17 13:45:03' AND '2022-05-17 15:45:03')
    013- SELECTtop 20 *FROM ( SELECT [i].[Id] AS [Id], [i].[CustomerId] AS [CustomerId], [i].[Sku] AS [Sku], [i].[Url] AS [Url], [i].[Type] AS [Type], [i].[FileSize] AS [FileSize], [i].[Status] AS [Status], [i].[IsMain] AS [IsMain], [i].[IsSpareMain] AS [IsSpareMain], [i].[IsWhiteBackground] AS [IsWhiteBackground], [i].[IsAttach] AS [IsAttach], [i].[Sort] AS [Sort], [i].[AddTime] AS [AddTime], [p].[UpdateTime] AS [UpdateTime] FROM ( SELECT [Id] AS [Id], [CustomerID] AS [CustomerId], [SKU] AS [Sku], [ImageUrl] AS [Url], [ImageType] AS [Type], [FileSize] AS [FileSize], [Status] AS [Status], [IsCover] AS [IsMain], [IsSpareCover] AS [IsSpareMain], [IsWhiteBackGround] AS [IsWhiteBackground], [IsFigure] AS [IsAttach], [SortBy] AS [Sort], [AddTime] AS [AddTime] FROM [RB_Product_Image] WITH ( NOLOCK ) WHERE ( [CustomerID] = 1 ) ) i INNER JOIN ( SELECT [CustomerID] AS [CustomerID], [SKU] AS [SKU], [UpdateTime] AS [UpdateTime] FROM [RB_Product] WITH ( NOLOCK ) WHERE ( [CustomerID] = 1 ) AND ( [ImageUpdateTime] BETWEEN '2022-05-17 13:45:03' AND '2022-05-17 15:45:03' ) ) p ON ( ( [i].[CustomerId] = [p].[CustomerID] ) AND ( [i].[Sku] = [p].[SKU] ) ) ) MergeTableORDER BY Id ASC; --select count(0) from [RB_Product_Image] nolock --40416416 --select count(0) from [RB_Product] nolock --2190570
    013+ SELECTtop 20 *FROM ( SELECT [i].[Id] AS [Id], [i].[CustomerId] AS [CustomerId], [i].[Sku] AS [Sku], [i].[Url] AS [Url], [i].[Type] AS [Type], [i].[FileSize] AS [FileSize], [i].[Status] AS [Status], [i].[IsMain] AS [IsMain], [i].[IsSpareMain] AS [IsSpareMain], [i].[IsWhiteBackground] AS [IsWhiteBackground], [i].[IsAttach] AS [IsAttach], [i].[Sort] AS [Sort], [i].[AddTime] AS [AddTime], [p].[UpdateTime] AS [UpdateTime] FROM ( SELECT [Id] AS [Id], [CustomerID] AS [CustomerId], [SKU] AS [Sku], [ImageUrl] AS [Url], [ImageType] AS [Type], [FileSize] AS [FileSize], [Status] AS [Status], [IsCover] AS [IsMain], [IsSpareCover] AS [IsSpareMain], [IsWhiteBackGround] AS [IsWhiteBackground], [IsFigure] AS [IsAttach], [SortBy] AS [Sort], [AddTime] AS [AddTime] FROM [RB_Product_Image] WITH ( NOLOCK ) WHERE ( [CustomerID] = 1 ) ) i INNER JOIN ( SELECT [CustomerID] AS [CustomerID], [SKU] AS [SKU], [UpdateTime] AS [UpdateTime] FROM [RB_Product] WITH ( NOLOCK ) WHERE ( [CustomerID] = 1 ) AND ( [ImageUpdateTime] BETWEEN '2022-05-17 13:45:03' AND '2022-05-17 15:45:03' ) ) p ON ( ( [i].[CustomerId] = [p].[CustomerID] ) AND ( [i].[Sku] = [p].[SKU] ) ) ) MergeTableORDER BY Id ASC; --select count(0) from [RB_Product_Image] nolock --40416416 --select count(0) from [RB_Product] nolock --2190570
    005- <p>A.优化后的sql ,将INNER JOIN 改为<span>EXISTS, 测试查询从25秒提高到1秒不到</span></p>
    005+ <p>A.优化后的sql ,将INNER JOIN 改为<span>EXISTS, 测试查询从25秒提高到1秒不到 ,已改造完成</span></p>
    009- <p>--select count(0) from [RB_Product_Image] nolock --40416416<br />--select count(0) from [RB_Product] nolock --2190570<br /><br />SELECT TOP 20 [Id] AS [Id],<br /> [CustomerID] AS [CustomerId],<br /> [SKU] AS [Sku],<br /> [ImageUrl] AS [Url],<br /> [ImageType] AS [Type],<br /> [FileSize] AS [FileSize],<br /> [Status] AS [Status],<br /> [IsCover] AS [IsMain],<br /> [IsSpareCover] AS [IsSpareMain],<br /> [IsWhiteBackGround] AS [IsWhiteBackground],<br /> [IsFigure] AS [IsAttach],<br /> [SortBy] AS [Sort],<br /> [AddTime] AS [AddTime]<br />FROM [RB_Product_Image] i<br />WHERE EXISTS (SELECT 1<br /> FROM [RB_Product] p<br /> WHERE i.sku = p.sku<br /> AND p.[ImageUpdateTime] BETWEEN '2022-01-17 13:45:03' AND '2022-05-17 15:45:03')<br /></p>
    009+ <p>--select count(0) from [RB_Product_Image] nolock --40416416<br />--select count(0) from [RB_Product] nolock --2190570<br /><br />SELECT TOP 20 [Id] AS [Id],<br /> [CustomerID] AS [CustomerId],<br /> [SKU] AS [Sku],<br /> [ImageUrl] AS [Url],<br /> [ImageType] AS [Type],<br /> [FileSize] AS [FileSize],<br /> [Status] AS [Status],<br /> [IsCover] AS [IsMain],<br /> [IsSpareCover] AS [IsSpareMain],<br /> [IsWhiteBackGround] AS [IsWhiteBackground],<br /> [IsFigure] AS [IsAttach],<br /> [SortBy] AS [Sort],<br /> [AddTime] AS [AddTime]<br />FROM [RB_Product_Image] i<br />WHERE EXISTS (SELECT 1<br /> FROM [RB_Product] p<br /> WHERE i.sku = p.sku<br /> AND p.[ImageUpdateTime] BETWEEN '2022-01-17 13:45:03' AND '2022-05-17 15:45:03')</p>
    013- <p>SELECT<br />top 20<br /> *<br />FROM<br /> (<br /> SELECT<br /> [i].[Id] AS [Id],<br /> [i].[CustomerId] AS [CustomerId],<br /> [i].[Sku] AS [Sku],<br /> [i].[Url] AS [Url],<br /> [i].[Type] AS [Type],<br /> [i].[FileSize] AS [FileSize],<br /> [i].[Status] AS [Status],<br /> [i].[IsMain] AS [IsMain],<br /> [i].[IsSpareMain] AS [IsSpareMain],<br /> [i].[IsWhiteBackground] AS [IsWhiteBackground],<br /> [i].[IsAttach] AS [IsAttach],<br /> [i].[Sort] AS [Sort],<br /> [i].[AddTime] AS [AddTime],<br /> [p].[UpdateTime] AS [UpdateTime]<br /> FROM<br /> (<br /> SELECT<br /> [Id] AS [Id],<br /> [CustomerID] AS [CustomerId],<br /> [SKU] AS [Sku],<br /> [ImageUrl] AS [Url],<br /> [ImageType] AS [Type],<br /> [FileSize] AS [FileSize],<br /> [Status] AS [Status],<br /> [IsCover] AS [IsMain],<br /> [IsSpareCover] AS [IsSpareMain],<br /> [IsWhiteBackGround] AS [IsWhiteBackground],<br /> [IsFigure] AS [IsAttach],<br /> [SortBy] AS [Sort],<br /> [AddTime] AS [AddTime]<br /> FROM<br /> [RB_Product_Image] WITH ( NOLOCK )<br /> WHERE<br /> ( [CustomerID] = 1 )<br /> ) i<br /> INNER JOIN (<br /> SELECT<br /> [CustomerID] AS [CustomerID],<br /> [SKU] AS [SKU],<br /> [UpdateTime] AS [UpdateTime]<br /> FROM<br /> [RB_Product] WITH ( NOLOCK )<br /> WHERE<br /> ( [CustomerID] = 1 )<br /> AND ( [ImageUpdateTime] BETWEEN '2022-05-17 13:45:03' AND '2022-05-17 15:45:03' )<br /> ) p ON ( ( [i].[CustomerId] = [p].[CustomerID] ) AND ( [i].[Sku] = [p].[SKU] ) )<br /> ) MergeTable<br />ORDER BY<br /> Id ASC;<br /><br /> --select count(0) from [RB_Product_Image] nolock --40416416<br /> --select count(0) from [RB_Product] nolock --2190570<br /></p>
    013+ <p>SELECT<br />top 20<br /> *<br />FROM<br /> (<br /> SELECT<br /> [i].[Id] AS [Id],<br /> [i].[CustomerId] AS [CustomerId],<br /> [i].[Sku] AS [Sku],<br /> [i].[Url] AS [Url],<br /> [i].[Type] AS [Type],<br /> [i].[FileSize] AS [FileSize],<br /> [i].[Status] AS [Status],<br /> [i].[IsMain] AS [IsMain],<br /> [i].[IsSpareMain] AS [IsSpareMain],<br /> [i].[IsWhiteBackground] AS [IsWhiteBackground],<br /> [i].[IsAttach] AS [IsAttach],<br /> [i].[Sort] AS [Sort],<br /> [i].[AddTime] AS [AddTime],<br /> [p].[UpdateTime] AS [UpdateTime]<br /> FROM<br /> (<br /> SELECT<br /> [Id] AS [Id],<br /> [CustomerID] AS [CustomerId],<br /> [SKU] AS [Sku],<br /> [ImageUrl] AS [Url],<br /> [ImageType] AS [Type],<br /> [FileSize] AS [FileSize],<br /> [Status] AS [Status],<br /> [IsCover] AS [IsMain],<br /> [IsSpareCover] AS [IsSpareMain],<br /> [IsWhiteBackGround] AS [IsWhiteBackground],<br /> [IsFigure] AS [IsAttach],<br /> [SortBy] AS [Sort],<br /> [AddTime] AS [AddTime]<br /> FROM<br /> [RB_Product_Image] WITH ( NOLOCK )<br /> WHERE<br /> ( [CustomerID] = 1 )<br /> ) i<br /> INNER JOIN (<br /> SELECT<br /> [CustomerID] AS [CustomerID],<br /> [SKU] AS [SKU],<br /> [UpdateTime] AS [UpdateTime]<br /> FROM<br /> [RB_Product] WITH ( NOLOCK )<br /> WHERE<br /> ( [CustomerID] = 1 )<br /> AND ( [ImageUpdateTime] BETWEEN '2022-05-17 13:45:03' AND '2022-05-17 15:45:03' )<br /> ) p ON ( ( [i].[CustomerId] = [p].[CustomerID] ) AND ( [i].[Sku] = [p].[SKU] ) )<br /> ) MergeTable<br />ORDER BY<br /> Id ASC;<br /><br /> --select count(0) from [RB_Product_Image] nolock --40416416<br /> --select count(0) from [RB_Product] nolock --2190570</p>
    参考解决方案 优化
  3. 2022-05-19 10:41:35, 由 陈少军 完成。
    修改了 总计消耗,旧值为 "0",新值为 "1"。
    修改了 实际完成,旧值为 "",新值为 "2022-05-19 10:41:28"。
    修改了 任务状态,旧值为 "wait",新值为 "done"。
    修改了 实际开始,旧值为 "0000-00-00 00:00:00",新值为 "2022-05-19 10:41:35"。
    修改了 由谁完成,旧值为 "",新值为 "chenshaojun"。
  4. 2022-07-16 17:09:18, 由 zhengqiao 关闭。
    修改了 任务状态,旧值为 "done",新值为 "closed"。
    修改了 指派给 ,旧值为 "chenshaojun",新值为 "closed"。
    修改了 由谁关闭,旧值为 "",新值为 "zhengqiao"。
    修改了 关闭时间,旧值为 "0000-00-00 00:00:00",新值为 "2022-07-16 17:09:18"。
    修改了 关闭原因,旧值为 "",新值为 "done"。
所属迭代 系统管理部 - 系统服务优化
所属模块 /
相关需求 暂无
指派给 Closed 于 2022-07-16 17:09:18
任务类型 后端
任务标签 初始
开发组
任务状态 已关闭
进度 100%
优先级 P2
关键词
抄送给
由谁创建 陈少军 于 2022-05-19 10:40:01
由谁完成 陈少军 于 2022-05-19 10:41:28
由谁取消 暂无
由谁关闭 zhengqiao 于 2022-07-16 17:09:18
关闭原因 已完成
最后编辑 zhengqiao 于 2022-07-16 17:09:18
团队 最初预计 总计消耗 预计剩余
工时信息
最初预计 0工时
总计消耗 1工时
预计剩余 0工时
预计开始 2022-05-19
实际开始 2022-05-19
截止日期 2022-05-19