【发布时间】:2010-09-12 19:25:33
【问题描述】:
我有一个数据仓库,其中包含典型的星型模式,以及一大堆执行此类操作的代码(显然要大得多,但这只是说明性的):
SELECT cdim.x
,SUM(fact.y) AS y
,dim.z
FROM fact
INNER JOIN conformed_dim AS cdim
ON cdim.cdim_dim_id = fact.cdim_dim_id
INNER JOIN nonconformed_dim AS dim
ON dim.ncdim_dim_id = fact.ncdim_dim_id
INNER JOIN date_dim AS ddim
ON ddim.date_id = fact.date_id
WHERE fact.date_id = @date_id
GROUP BY cdim.x
,dim.z
我正在考虑用视图替换它(例如MODEL_SYSTEM_1),这样它就变成了:
SELECT m.x
,SUM(m.y) AS y
,m.z
FROM MODEL_SYSTEM_1 AS m
WHERE m.date_id = @date_id
GROUP BY m.x
,m.z
但是视图 MODEL_SYSTEM_1 必须包含唯一的列名,如果我继续这样做,我还担心优化器的性能,因为我担心 WHERE 子句中的所有项目都跨越不同的事实和维度得到优化,因为视图将跨越一整颗星,并且视图不能参数化(男孩,那不是很酷!)
所以我的问题是 -
这种方法是否可行,或者它只是一种抽象,会损害性能并且除了更好的语法之外没有给我任何东西?
在所有适当的 PK 和 FK 都已就位的情况下,对这些视图进行代码生成、消除重复的列名(即使稍后需要手动调整视图)的最佳方法是什么?我应该只写一些 SQL 将其从
INFORMATION_SCHEMA中提取出来,还是已经有一个很好的例子可用。
编辑:我已经对其进行了测试,即使在更大的进程上,性能似乎也是一样的 - 甚至加入了多个星,每个星都使用这些视图。
自动化主要是因为数据仓库里面有很多这样的star,设计者已经做好了FK/PK,但是我不想把所有的表或者文档都挑一遍.我编写了一个脚本来生成视图(它还生成表格的缩写),它可以很好地从INFORMATION_SCHEMA 自动生成骨架,然后可以在提交视图创建之前对其进行调整。
如果有人想要代码,我可以在这里发布。
【问题讨论】:
标签: sql sql-server tsql code-generation data-warehouse