确定性标量函数

时间:2008-11-19 20:49:51

标签: sql-server ssms

我想索引数据库表中的计算列,该列使用许多用户定义的函数。但是我刚刚得知我的专栏是非确定性的。

如果不对其进行索引,就会减慢运行我需要的查询的速度。

跟踪用户定义函数以确定它们是否具有确定性的最佳方法是什么?

SQL Server Management Studio中是否有任何类型的工具可以告诉我用户定义的函数是确定性的还是我只需要跟踪我正在使用的所有系统定义的函数来找出哪些是非确定性并找到其他方法来编写没有它们的代码?

3 个答案:

答案 0 :(得分:2)

尝试:

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 :(得分:1)

由于您说您正在使用许多用户定义的函数,您是否尝试过分别在每个函数上创建基于函数的索引?这应该至少缩小范围。

答案 2 :(得分:0)

我弄清楚为什么我的功能是不确定的。它依赖于带有样式代码1,3的转换语句,然后依赖于高于100的其他语句。

根据msdn转换是:

确定性,除非存在以下条件之一:

源类型是sql_variant。

目标类型是sql_variant,其源类型是不确定的。

源或目标类型是datetime或smalldatetime,其他源或目标类型是字符串,并指定了非确定性样式。要确定性,样式参数必须是常量。此外,小于或等于100的样式是不确定的,样式20和21除外。大于100的样式是确定性的,样式106,107,109和113除外。