你能优化一个带有许多UNION ALL到外部数据库的视图吗



在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优化了查询。之后,我更多地使用了仍然没有优化的真实世界视图。我发现,奇怪的是,规划者正在优化许多子视图。然而,规划师总是会包含一些特定的子视图。在这一点上,我不知道为什么规划者总是包括这些特定的子视图。

最新更新