我有一个通过 组合多个表的视图UNION ALL
,并使用数据处理一些基本错误。由于处理错误的方式,视图比我希望的要慢一些。有没有办法缓存视图的输出,并在任何基础表更新时动态更新它?
我的系统的一些怪癖:
- 数据库每天只在非工作时间查看一次更新。因此,只要在这些非工作时间消耗资源,资源密集型解决方案就可以了。
- 由于系统的设置方式,我宁愿在加载数据时不清理数据,而宁愿保持底层表不变。
- 我设置了适当的支持索引
- 这些表都包含不同的记录,没有重叠,所以我需要把它们都拉进去
我考虑过的一些选项:
- 由于视图依赖于 UNION 运算符,索引视图将不起作用。
- 我还没有找到任何方法来缓存 TVF 的输出。
- 如果修改了基础表,我可以创建一个缓存表并在任何时候手动加载它,但这感觉就像一个 hacky 解决方法。我想我还必须为此创建一个 SQL 代理作业,因为将其设置为触发器将涉及每天晚上在表被覆盖时刷新表数百万次。
- 我可以忍受糟糕的性能,但这会对最终用户产生负面影响。
这是视图的简化示例:
CREATE OR ALTER VIEW AllNamesAndAccountNumbers AS
SELECT
x.AccountNumber
, COALESCE(x.FullName, n.FullName) AS FullName
FROM (
SELECT
AccountNumber
, FullName
FROM TableWithNames
UNION ALL
SELECT
AccountNumber
, NULL AS FullName
FROM TableMissingNames
) x
LEFT JOIN NameMappings n -- this join is slow due to the table being really huge
ON n.AccountNumber = x.AccountNumber
哦 - 如果这是一个反模式,我应该从一个完全不同的角度来攻击它,请这么说。我担心我看错了。
这就是后备。在加载临时表后运行 ETL 作业是完全正常的。
您也许可以使用 2 个索引视图而不是一个来执行某些操作。而且,当然,您可以使用索引和列存储表来提高查询性能。