SQL Server:跨连接的持久“缓存”表

时间:2009-11-09 21:56:04

标签: sql-server

我有一组大约100万行(大约行数:1.5kb)需要“缓存”,以便我们的应用程序的许多不同部分都可以使用它。

这些行是来自其他表的编译数据的派生/非规范化“视图”。生成这些数据并不是非常昂贵(30-60秒),但是太快而无法生成“动态”作为应用程序可以直接查询的视图或表值函数的一部分。我想定期更新这些数据,也许每隔几分钟更新一次。

我的第一个想法是让计划的作业每隔 n 分钟用这些数据更新一个全局临时表。

最佳策略是什么,表现明智?我不确定将它存储在真实表中的性能影响与全局临时表(## tablename)相比,我还没有想到的其他策略。我不想通过插入此表来破坏事务日志...它是所有派生数据,不需要保留。

我正在使用Microsoft SQL Server 2000.在此项目的时间范围内升级不是一种选择,但如果2005/2008/2010中的功能可以使这更容易,我会很感激听到这一点。< / p>

1 个答案:

答案 0 :(得分:1)

我建议使用materialized view(AKA索引视图)。

限制:

  1. 视图定义必须始终从相同的基础数据返回相同的结果。
  2. 视图无法使用非确定性函数。
  3. View上的第一个索引必须是一个集群的UNIQUE索引。
  4. 如果您使用分组依据,则必须在选择列表中包含新的COUNT_BIG(*)。
  5. 视图定义不能包含以下内容:

    1. TOP
    2. 文字,ntext或图片列
    3. DISTINCT
    4. MIN,MAX,COUNT,STDEV,VARIANCE,AVG
    5. 可以为空的表达式上的SUM
    6. 派生表
    7. 行集功能
    8. 另一种观点
    9. UNION
    10. 子查询,外连接,自连接
    11. 像CONTAIN或FREETEXT
    12. 这样的全文谓词
    13. COMPUTE或COMPUTE BY
    14. 无法在视图定义中包含订单