我有一个采用Fact Constellation Schema设计的 SQL Server 数据仓库。我必须建立一个关于 4 个对象/视图的报告:
- 销售实际值 - 事实表 [销售]
- 销售目标 - 事实表 [目标]
- 股票 - 事实表 [库存]
- 入站 - 事实表 [中转]
所有对象/视图都具有相同的签名,例如:
Sales actuals: ProductID, RegionID, SalesManagerID, ..., <product data>, <region data>, ..., Quantity;
Sales targets: ProductID, --null--, SalesManagerID, ..., <product data>, -----null----, ..., Quantity;
Stocks: ProductID, RegionID, -----null-----, ..., <product data>, <region data>, ..., Quantity;
...
为了实现这样的签名,每个对象/视图都来自一个事实表和 5-6 个维度表。维度表在对象之间共享(包含产品数据的表、包含区域数据的表……)。
计算每个视图所需的 SQL 不会超过 5-10 秒。
现在我想将它们组合在一个报告中,我正在这样做:
Select * from [Sales actuals]
UNION
Select * from [Sales targets]
UNION
Select * from [Stocks]
UNION
Select * from [Inbound]
在这里,SQL 甚至无法在 1 分钟内检索 10% 的数据。查询优化器似乎将 4 个事实表组合成一个大向量并附加维度表 - 这使系统发疯。
我想要的是保持封装的视图/对象。这意味着,引擎必须首先计算视图(4 * 5 秒 = 20 秒)。然后才应用联合操作(10 秒 + 一些开销)来检索结果。
问题:如何禁用嵌套视图中的查询优化以实现这种“计算封装”?
像编译器那样做:首先联合事实表,然后加入维度表——这是没有选择的,因为我想保持代码的可解释性和可重用性。
提前致谢!君士坦丁