在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论坛:https://dba.stackexchange.com/questions/96501/can-you-optimize-a-view-with-many-union-alls-to-external-databases
跟进:这是我从一个更复杂的案例(~1K子视图)中设计的一个例子,其中执行计划器包含的子查询比我期望的一个子查询多。感谢那些回复并确认Sql应该针对这种类型的视图优化查询的人。它让我意识到我很懒,而且还没有真正测试我对优化器如何工作的基本假设。
所以我就这么做了。我构建了一个简单的概念验证,并很快确认Sql优化了查询。之后,我更多地使用了仍然没有优化的真实世界视图。我发现,奇怪的是,规划者正在优化许多子视图。然而,规划师总是会包含一些特定的子视图。在这一点上,我不知道为什么规划者总是包括这些特定的子视图。