【问题标题】:Deterministic Scalar Functions确定性标量函数
【发布时间】:2008-11-19 20:49:50
【问题描述】:

我想在我的数据库表中索引一个计算列,它使用了许多用户定义的函数。但是我刚刚了解到我的专栏是不确定的。

如果不建立索引,它会降低运行我需要的查询的速度。

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

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

【问题讨论】:

    标签: sql-server ssms


    【解决方案1】:

    试试:

    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。

    索引一个不确定的列是非常愚蠢的——毕竟如果它的值不严格依赖于参数,如果它随意改变你就不会很有用,特别是如果它被用于找东西的索引!

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我明白了为什么我的函数是不确定的。它依赖于样式代码为 1、3 和其他大于 100 的 Convert 语句。

      根据msdn转换为:

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

      源类型是 sql_variant。

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

      源或目标类型是 datetime 或 smalldatetime,另一个源或目标类型是字符串,并且指定了非确定性样式。为了具有确定性,样式参数必须是常数。此外,小于或等于 100 的样式是不确定的,除了样式 20 和 21。大于 100 的样式是确定的,除了样式 106、107、109 和 113。

      【讨论】:

        猜你喜欢
        • 2022-01-17
        • 2013-12-13
        • 2010-12-20
        • 2012-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-27
        • 2011-12-18
        相关资源
        最近更新 更多