您可以使用许多UNION ALL优化外部数据库的视图吗?

时间:2015-03-27 02:07:02

标签: 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 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?

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

1 个答案:

答案 0 :(得分:0)

我将此问题移至dba论坛: https://dba.stackexchange.com/questions/96501/can-you-optimize-a-view-with-many-union-alls-to-external-databases

关注:这是我从一个更复杂的案例(~1K子视图)中设计的一个例子,其中执行计划程序包含的子查询多于我期望的一个子查询。感谢那些回复并确认Sql应针对此类视图优化查询的人。它让我意识到我是懒惰的,并没有真正测试我对优化器如何工作的基本假设。

所以我做到了。我构建了一个简单的概念证明,并确认Sql优化了查询。接下来,我更多地使用仍然没有优化的真实世界视图。我发现奇怪的是,规划师正在优化许多子视图。虽然计划程序总是包含特定的子视图。在这一点上,我不知道为什么规划者总是包含这些特定的子视图。