【发布时间】:2010-10-12 18:42:31
【问题描述】:
我想记住函数结果以提高性能,即延迟填充函数参数索引的缓存。第一次调用函数时,缓存不会有任何输入参数,因此它会在返回之前计算并存储它。后续调用只使用缓存。
然而,SQL Server 2000 似乎有一个愚蠢的任意规则,即函数是“确定性的”。禁止插入、更新和常规存储过程调用。但是,允许扩展存储过程。这是如何确定的?如果另一个会话修改了数据库状态,函数输出无论如何都会改变。
我快疯了。我曾认为我可以使缓存对用户透明。这可能吗?我没有部署扩展存储过程的权限。
编辑:
这个限制还在 2008 年。看在上帝的份上,你不能打电话给 RAND!
缓存将由我在数据库中实现。缓存是用于缓存的任何数据存储...
编辑:
除了对基础数据的更改之外,没有任何情况下函数的相同参数会产生不同的结果。这是一个 BI 平台,唯一的变化来自预定的 ETL,那时我会 TRUNCATE 缓存表。
这些是 I/O 密集型时间序列计算,数量级为 O(n^4)。我无权更改基础表或索引。此外,其中许多函数使用相同的中间函数,并且缓存允许使用这些函数。
UDF 并不是真正的确定性,除非它们考虑到数据库状态的变化。重点是什么? SQL Server 是否缓存? (具有讽刺意味。)如果 SQL Server 正在缓存,那么它必须在对模式绑定的表进行更改时到期。如果它们是模式绑定的,那么为什么不绑定函数修改的表呢?我可以理解为什么不允许使用 proc,尽管这很草率;只是模式绑定过程。而且,顺便说一句,为什么允许扩展存储过程?你不可能追踪那些为确保确定性所做的事情!!!啊!!!
编辑:
我的问题是:有什么办法可以在视图中使用延迟缓存函数结果吗?
【问题讨论】:
-
抱歉,从您的原始帖子中我不清楚您是“从头开始”创建缓存的。您打算如何处理具有相同参数的相同函数应该返回不同结果的情况?
标签: sql-server caching sql-server-2000