Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 它是如何工作的查询中的多个子选择_Sql Server_Sql Server 2012 - Fatal编程技术网

Sql server 它是如何工作的查询中的多个子选择

Sql server 它是如何工作的查询中的多个子选择,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我有一个由PowerBi桌面查询折叠生成的查询。 我想了解它是如何工作的。 我可以看到有一个大查询,带有嵌套的子选择 如果我运行这个查询,大约需要1秒钟才能完成。 但当我运行第二个查询时,即多个子选择中的内部查询时,这大约需要两分钟 那么,SQL server如何处理前1000名或子选择中的WHERE? 为什么内部查询比整个查询慢 谢谢 整个查询(更快) 因为整个查询包含两个筛选器: where [_].[SUSCRIPCIO] >= convert(datetime2, '2020-01

我有一个由PowerBi桌面查询折叠生成的查询。 我想了解它是如何工作的。 我可以看到有一个大查询,带有嵌套的子选择

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

那么,SQL server如何处理前1000名或子选择中的WHERE? 为什么内部查询比整个查询慢

谢谢

整个查询(更快)


因为整个查询包含两个筛选器:

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

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

我不得不问,为什么您会选择将对象别名为
[\u]
[$Table]
我没有选择。该代码是由PowerBi的“查询折叠”功能“自动”生成的(顺便说一句,我讨厌它),谢谢。但奇怪的是,外部查询使用内部查询,而外部查询比内部查询快。所以,我应该假设SQL Server能够使用外部查询的WHERE来过滤内部查询吗?正确。外部查询中的过滤器意味着它只需要从内部查询中获取有限的一组值。它不会首先对内部查询进行完全求值,然后对其进行过滤,而是在满足条件之前进行过滤。就像您有一个包含数百万行的表,并使用“select top 10*”对其进行筛选一样,它不会尝试选择所有行,然后只返回前十行,它会返回10行,然后停止运行。进一步解释
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