我不明白为什么这个查询很慢

问题描述 投票:-3回答:1

我的查询对我们的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]
)));

如果我删除最后一部分它<1秒(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个回答
0
投票

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

  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然后运行查询并发布结果

© www.soinside.com 2019 - 2024. All rights reserved.