在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?
*再次注意,子查询视图调用外部数据库。
答案 0 :(得分:0)
我将此问题移至dba论坛: https://dba.stackexchange.com/questions/96501/can-you-optimize-a-view-with-many-union-alls-to-external-databases
关注:这是我从一个更复杂的案例(~1K子视图)中设计的一个例子,其中执行计划程序包含的子查询多于我期望的一个子查询。感谢那些回复并确认Sql应针对此类视图优化查询的人。它让我意识到我是懒惰的,并没有真正测试我对优化器如何工作的基本假设。
所以我做到了。我构建了一个简单的概念证明,并确认Sql优化了查询。接下来,我更多地使用仍然没有优化的真实世界视图。我发现奇怪的是,规划师正在优化许多子视图。虽然计划程序总是包含特定的子视图。在这一点上,我不知道为什么规划者总是包含这些特定的子视图。