【问题标题】:I don't understand why this query is slow我不明白为什么这个查询很慢
【发布时间】:2019-09-07 07:15:39
【问题描述】:

我有一个查询对我们的 microsoft sql 数据库来说很慢。如果我删除它的一部分,它会加快速度,但我不明白为什么并且查询规划器没有帮助我(我缺少一些东西)。

超过 30 秒的慢查询 (queryplan):

SELECT COUNT(*)
FROM [dbo].[CarImage] AS [t0]
     LEFT OUTER JOIN [dbo].[Dismantled] AS [t1] ON [t1].[Id] = [t0].[DismantledId]
WHERE([t1].[FinishedReason] <> 0)
     AND ([t1].[FinishedDate] < GETDATE() - 365)
     AND (NOT(EXISTS
(
    SELECT NULL AS [EMPTY]
    FROM [dbo].[Part] AS [t2]
    WHERE([t2].[Status] <> 4)
         AND ([t2].[Status] <> 3)
         AND ([t2].[DismantledId] = [t1].[Id])
)))
     AND (NOT(EXISTS
(
    SELECT NULL AS [EMPTY]
    FROM [dbo].[Part] AS [t3]
    WHERE([t3].[Status] = 3)
         AND ([t3].[SoldDate] > GETDATE() - 365)
         AND ([t3].[DismantledId] = [t1].[Id])
)))
     AND ((NOT(EXISTS
(
    SELECT NULL AS [EMPTY]
    FROM [dbo].[Partner] AS [t4], 
         [dbo].[SelfPickSite] AS [t5]
    WHERE([t4].[Id] = [t1].[PartnerId])
         AND ([t5].[PartnerId] = [t4].[Id])
)))
          OR (EXISTS
(
    SELECT NULL AS [EMPTY]
    FROM [dbo].[SelfPickCar] AS [t6]
    WHERE [t6].[DismantledId] = [t1].[Id]
)));

如果我删除最后一部分,则为 queryplan):

SELECT COUNT(*)
FROM [dbo].[CarImage] AS [t0]
     LEFT OUTER JOIN [dbo].[Dismantled] AS [t1] ON [t1].[Id] = [t0].[DismantledId]
WHERE([t1].[FinishedReason] <> 0)
     AND ([t1].[FinishedDate] < GETDATE() - 365)
     AND (NOT(EXISTS
(
    SELECT NULL AS [EMPTY]
    FROM [dbo].[Part] AS [t2]
    WHERE([t2].[Status] <> 4)
         AND ([t2].[Status] <> 3)
         AND ([t2].[DismantledId] = [t1].[Id])
)))
     AND (NOT(EXISTS
(
    SELECT NULL AS [EMPTY]
    FROM [dbo].[Part] AS [t3]
    WHERE([t3].[Status] = 3)
         AND ([t3].[SoldDate] > GETDATE() - 365)
         AND ([t3].[DismantledId] = [t1].[Id])
)))
     AND ((NOT(EXISTS
(
    SELECT NULL AS [EMPTY]
    FROM [dbo].[Partner] AS [t4], 
         [dbo].[SelfPickSite] AS [t5]
    WHERE([t4].[Id] = [t1].[PartnerId])
         AND ([t5].[PartnerId] = [t4].[Id])
))));

【问题讨论】:

  • 您能否详细介绍一下查询和您删除的部分?没有任何上下文,将无法为您提供帮助
  • 对不起,我在添加所有内容之前不小心发布了。现已更新。

标签: sql sql-server query-performance


【解决方案1】:

OR 是性能杀手; 请尝试此查询并给我结果

  SELECT COUNT(*)
    FROM (
        SELECT 1
        FROM [dbo].[CarImage] AS [t0]
        LEFT JOIN [dbo].[Dismantled] AS [t1] ON [t1].[Id] = [t0].[DismantledId]
        WHERE ([t1].[FinishedReason] <> 0)
            AND ([t1].[FinishedDate] < GETDATE() - 365)
            AND (
                NOT (
                    EXISTS (
                        SELECT NULL AS [EMPTY]
                        FROM [dbo].[Part] AS [t2]
                        WHERE ([t2].[Status] <> 4)
                            AND ([t2].[Status] <> 3)
                            AND ([t2].[DismantledId] = [t1].[Id])
                        )
                    )
                )
            AND (
                NOT (
                    EXISTS (
                        SELECT NULL AS [EMPTY]
                        FROM [dbo].[Part] AS [t3]
                        WHERE ([t3].[Status] = 3)
                            AND ([t3].[SoldDate] > GETDATE() - 365)
                            AND ([t3].[DismantledId] = [t1].[Id])
                        )
                    )
                )
            AND (
                (
                    NOT (
                        EXISTS (
                            SELECT NULL AS [EMPTY]
                            FROM [dbo].[Partner] AS [t4]
                                ,[dbo].[SelfPickSite] AS [t5]
                            WHERE ([t4].[Id] = [t1].[PartnerId])
                                AND ([t5].[PartnerId] = [t4].[Id])
                            )
                        )
                    )

                UNION ALL

                SELECT 1
                FROM [dbo].[CarImage] AS [t0]
                LEFT JOIN [dbo].[Dismantled] AS [t1] ON [t1].[Id] = [t0].[DismantledId]
                WHERE (
                        EXISTS (
                            SELECT NULL AS [EMPTY]
                            FROM [dbo].[SelfPickCar] AS [t6]
                            WHERE [t6].[DismantledId] = [t1].[Id]
                            )
                        )
                )
        ) X

ps : 如果你有性能问题运行这个代码SET STATISTICS IO ON 然后运行查询并发布结果

【讨论】:

  • 这里好像有错误。您输入了 Union all,与什么联合?以上不存在?
  • 对不起,我是通过手机发布的,而不是或使用 2 select 语句
猜你喜欢
  • 1970-01-01
  • 2011-03-11
  • 2016-12-07
  • 2020-03-19
  • 2014-03-12
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多