我想要为了提高性能而记忆化函数结果,即懒加载一个以函数参数为索引的缓存。第一次调用函数时,缓存中没有任何输入参数的内容,因此它将计算并存储结果,然后返回它。随后的调用只需使用缓存即可。
然而,似乎 SQL Server 2000 有一个愚蠢的任意规则,限制函数必须是“确定性”的。这意味着禁止使用 INSERT、UPDATE 和常规存储过程调用。但是,允许使用扩展存储过程。这怎么是确定性的?如果另一个会话修改了数据库状态,函数输出就会发生变化。
我非常生气。我原本以为可以使缓存对用户透明。这可能吗?我没有权限部署扩展存储过程。
编辑:
这个限制在 2008 年仍然存在。你甚至不能调用 RAND 函数!
缓存将由我在数据库中实现。缓存是用于缓存的任何数据存储...
编辑:
除了基础数据的更改外,没有任何情况下相同的函数参数将产生不同的结果。这是一个商业智能平台,唯一的更改来自计划的 ETL,在那时我会 TRUNCATE 缓存表。
这些是 I/O 密集型时间序列计算,大约是 O(n^4) 的规模。我没有权利更改基础表或索引。此外,许多这些函数使用相同的中间函数,缓存允许使用它们。
UDF 并不真正是确定性的,除非它们考虑到数据库状态的更改。那有什么意义呢?SQL Server 是否具有缓存功能?(具有讽刺意味。)如果 SQL Server 具有缓存功能,则必须在绑定模式下对更改表的缓存进行过期处理。如果它们是绑定模式,则为什么不绑定函数修改的表?我可以理解为什么不允许存储过程,尽管这只是粗心;只需对存储过程进行模式绑定即可。而且,顺便说一句,为什么允许扩展存储过程?你不可能跟踪这些过程以确保确定性!!!啊!!!
编辑:
我的问题是:是否有任何方法可以懒惰地缓存函数结果,并以视图的方式使用它们?
然而,似乎 SQL Server 2000 有一个愚蠢的任意规则,限制函数必须是“确定性”的。这意味着禁止使用 INSERT、UPDATE 和常规存储过程调用。但是,允许使用扩展存储过程。这怎么是确定性的?如果另一个会话修改了数据库状态,函数输出就会发生变化。
我非常生气。我原本以为可以使缓存对用户透明。这可能吗?我没有权限部署扩展存储过程。
编辑:
这个限制在 2008 年仍然存在。你甚至不能调用 RAND 函数!
缓存将由我在数据库中实现。缓存是用于缓存的任何数据存储...
编辑:
除了基础数据的更改外,没有任何情况下相同的函数参数将产生不同的结果。这是一个商业智能平台,唯一的更改来自计划的 ETL,在那时我会 TRUNCATE 缓存表。
这些是 I/O 密集型时间序列计算,大约是 O(n^4) 的规模。我没有权利更改基础表或索引。此外,许多这些函数使用相同的中间函数,缓存允许使用它们。
UDF 并不真正是确定性的,除非它们考虑到数据库状态的更改。那有什么意义呢?SQL Server 是否具有缓存功能?(具有讽刺意味。)如果 SQL Server 具有缓存功能,则必须在绑定模式下对更改表的缓存进行过期处理。如果它们是绑定模式,则为什么不绑定函数修改的表?我可以理解为什么不允许存储过程,尽管这只是粗心;只需对存储过程进行模式绑定即可。而且,顺便说一句,为什么允许扩展存储过程?你不可能跟踪这些过程以确保确定性!!!啊!!!
编辑:
我的问题是:是否有任何方法可以懒惰地缓存函数结果,并以视图的方式使用它们?