Sql server 您可以优化具有多个外部数据库联合调用的视图吗?
在Sql Server 2012数据库中提供以下视图: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
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将不需要获取/构建经过筛选且永远无法选择的结果集。虽然这并不是说如何访问视图和/或在特定情况下它是否不同(与我过去的观察结果不同)。