它是如何工作的? - 查询中的多个 SubSelect

How does it works? - Multiple SubSelect in Query

我有一个由 PowerBi Desktop 的 QueryFolding 生成的查询。 我试图了解它是如何工作的。 我可以看到有一个大查询,带有嵌套的 sub-selects.

如果我 运行 这个查询,这需要大约 1 秒才能完成。 但是当我 运行 第二个查询时,即多个子 select 的内部查询,这需要大约两分钟。

那么,SQL 服务器如何处理子select 中的TOP 1000 或WHERE? 为什么内部查询比整个查询慢?

谢谢!!

整个查询(更快)

select top 1000
    [_].[NOMBRE_1] as [NOMBRE_1],
    [_].[SUSCRIPCIO] as [SUSCRIPCIO],
    [_].[ANOMES] as [ANOMES],
    1 as [Rut]
from 
(
    select [_].[NOMBRE_1],
        [_].[SUSCRIPCIO],
        [_].[ANOMES]
    from 
    (
        select [NOMBRE_1],
            [SUSCRIPCIO],
            [ANOMES]
        from [dbo].[TABLE] as [$Table]
    ) as [_]
    where [_].[SUSCRIPCIO] >= convert(datetime2, '2020-01-01 00:00:00') and [_].[SUSCRIPCIO] <= convert(datetime2, '2020-02-01 00:00:00')
) as [_]

内部子选择(较慢)

select [NOMBRE_1],
    [SUSCRIPCIO],
    [ANOMES]
from [dbo].[TABLE] as [$Table]

因为整个查询包括两个过滤器:

where [_].[SUSCRIPCIO] >= convert(datetime2, '2020-01-01 00:00:00') and [_].[SUSCRIPCIO] <= convert(datetime2, '2020-02-01 00:00:00')

top 1000

这显着限制了查询 return 的值,使查询 运行 更快。另一方面,内部查询没有过滤器,因此它必须 return 完整的结果集。如果 [$Table] 有很多行,那么这可能是一个漫长的过程