Sql server 您可以优化具有多个外部数据库联合调用的视图吗?

Sql server 您可以优化具有多个外部数据库联合调用的视图吗?,sql-server,sql-server-2012,Sql Server,Sql Server 2012,在Sql Server 2012数据库中提供以下视图: create view vManyUnions as select 1 as p, a from vSubQuery_1 union all select 2 as p, a from vSubQuery_2 union all select 3 as p, a from vSubQuery_3 ... union all select n as p, a from vSubQ

在Sql Server 2012数据库中提供以下视图:

create view vManyUnions as
    select 1 as p, a from vSubQuery_1
    union all
    select 2 as p, a from vSubQuery_2
    union all
    select 3 as p, a from vSubQuery_3
    ...
    union all
    select n as p, a from vSubQuery_n

create view vSubQuery_1 as
    select a from [externalDb].[dbo].[someTable] where b = something

create view vSubQuery_2 as
    select a from [externalDb].[dbo].[someTable] where b = somethingElse

create view vSubQuery_3 as
    select a from [externalDb].[dbo].[someTable] where b = somethingElseStill

...

create view vSubQuery_n as
    select a from [externalDb].[dbo].[someTable] where b = youGetTheIdea
鉴于这个问题:

select * from vManyUnions where p = 1
可以进行哪些优化(如果有的话),以使Sql Server 2012在运行查询时仅计算vSubQuery_1


*再次注意,子查询视图称为外部数据库。

我将此问题转移到dba论坛:

跟进:这是一个我从一个更复杂的案例(~1K子视图)中设计出来的示例,其中执行计划器包含的子查询比我预期的多。感谢那些回复并确认Sql应该针对这种类型的视图优化查询的人。这让我意识到我很懒,而且实际上还没有测试我对优化器工作原理的基本假设


所以我就这么做了。我构建了一个简单的概念证明,并很快确认Sql优化了查询。在那之后,我更多地使用仍然没有优化的真实世界视图。我发现,奇怪的是,计划者正在优化许多子视图。不过,规划器始终包含一些特定的子视图。此时,我不知道为什么规划器总是包含这些特定的子视图。

不确定为什么您需要这么多视图,而不是
select*from vManyUnions,其中p=1
这就是为什么您不能使用
从[externalDb].[dbo].[someTable]中选择a,其中b=something
Sql Server 2012@Fireblade,我不知道你的意思是什么?@newbyca这两个查询将返回相同的结果,因为在我的情况下,vManyUnions的用户对外部数据库或子查询视图一无所知。这个问题可能应该在DBA堆栈上,因为它涉及一个非常具体的请求和SQL Server完成的优化。对于“普通”union语句,在我所做的类似查询中,SQL Server将不需要获取/构建经过筛选且永远无法选择的结果集。虽然这并不是说如何访问视图和/或在特定情况下它是否不同(与我过去的观察结果不同)。