0

我的数据库 ( MSSQL) 中有一个视图需要 1 分钟以上才能输出结果。由于这需要很长时间,我让用户能够查看实时数据或缓存数据。我通过从视图中生成数据并每小时将其插入表中并通过在 use_cached = 0 或 1 上定义配置变量来做到这一点。

假设视图称为 v_foo,缓存表称为 t_bar。我想创建另一个从 v_foo if 中选择use_cached = 0并从 t_bar if 中选择的视图use_cached = 1.

我尝试了类似的东西

Create view v_final as 
select * from v_foo
where (select count(*) from config where id = 'use_cache' and value = 1) = 0
UNION ALL
select * from t_bar
where (select count(*) from config where id = 'use_cache' and value = 1) = 1

但这会导致始终计算来自联合的两个查询,即使其中一个不返回任何行。使用函数也是一个不太好的解决方案,因为为了使用 IF 条件返回一个表,我必须声明一个临时表并且仅仅填充它需要将近 17 秒。

有什么帮助吗?

4

1 回答 1

0

例如,您可以将存储过程与以下代码一起使用:

if (exists (select * from config where id = 'use_cache' and value = 1))
    select * from t_bar
else
    select * from v_foo
于 2012-09-14T19:09:08.213 回答