我想在我的数据库表中索引一个计算列,它使用许多用户定义的函数。但是我刚刚了解到我的专栏是不确定的。
如果没有索引,它会降低运行我需要的查询的速度。
跟踪用户定义函数以确定它们是否具有确定性的最佳方法是什么?
SQL Server Management Studio 中是否有任何工具可以告诉我用户定义的函数是否是确定性的,或者我只需要跟踪我正在使用的所有系统定义的函数来找出哪些是非确定性的并找到在没有它们的情况下编写我的代码的其他方法?
我想在我的数据库表中索引一个计算列,它使用许多用户定义的函数。但是我刚刚了解到我的专栏是不确定的。
如果没有索引,它会降低运行我需要的查询的速度。
跟踪用户定义函数以确定它们是否具有确定性的最佳方法是什么?
SQL Server Management Studio 中是否有任何工具可以告诉我用户定义的函数是否是确定性的,或者我只需要跟踪我正在使用的所有系统定义的函数来找出哪些是非确定性的并找到在没有它们的情况下编写我的代码的其他方法?
尝试:
SELECT *
FROM INFORMATION_SCHEMA.ROUTINES
WHERE IS_DETERMINISTIC = 'NO'
AND ROUTINE_TYPE = 'FUNCTION'
或者
SELECT OBJECTPROPERTY(OBJECT_ID('schemaname.functionname'), 'IsDeterministic')
抱歉,IIRC,SQL Server 2000 不允许非确定性 UDF。
索引一个不确定的列是非常愚蠢的——毕竟如果它的值不严格依赖于参数,那么如果它随意改变你就不会很有用,特别是如果它被用于索引找东西!
既然您说您正在使用许多用户定义的函数,那么您是否尝试过分别为每个函数创建一个基于函数的索引?这至少应该缩小范围。
我弄清楚了为什么我的函数是不确定的。它依赖于具有样式代码 1、3 以及其他大于 100 的 Convert 语句。
根据 msdn 转换为:
确定性,除非存在以下条件之一:
源类型是 sql_variant。
目标类型是 sql_variant,其源类型是不确定的。
源或目标类型为 datetime 或 smalldatetime,其他源或目标类型为字符串,并指定了非确定性样式。为了具有确定性,样式参数必须是常数。此外,小于或等于 100 的样式是不确定的,除了样式 20 和 21。大于 100 的样式是确定的,除了样式 106、107、109 和 113。