【问题标题】:What does it mean by "Non-deterministic User-Defined functions can be used in a deterministic manner"?“可以以确定性方式使用非确定性用户定义函数”是什么意思?
【发布时间】:2010-10-17 02:42:53
【问题描述】:

根据Deterministic and Nondeterministic Functions 上的 MSDN SQL BOL(联机丛书)页面,可以“以确定性方式”使用非确定性函数

以下函数并不总是确定性的,但当它们以确定性方式指定时,可用于索引视图或计算列的索引。

非确定性函数可以以确定性方式使用是什么意思?
有人可以说明如何做到这一点吗?以及在哪里你会这样做?

【问题讨论】:

    标签: sql sql-server user-defined-functions deterministic non-deterministic


    【解决方案1】:

    一个函数是确定性的意味着它保证总是为相同的输入参数返回相同的输出值。

    我假设以确定性方式使用非确定性函数意味着您确保将传递给函数的参数范围使得返回值是确定性的,即。仅依赖于这些论点。

    这在实践中意味着什么取决于函数做什么以及它以何种方式是不确定的。

    【讨论】:

    • 该死!我得换个更快的扳机指!
    • 实际上 BOL 列出了所有不总是确定性的函数,并指定它们何时是确定性的,何时不是确定性的。其他函数要么总是确定性的,要么总是非确定性的
    【解决方案2】:

    BOL 实际上声明:

    以下功能是不 总是确定性的,但可以 用于索引视图或索引 计算列时 以确定的方式指定。

    然后在下面说明必须满足哪些条件才能使它们具有确定性。

    例如

    CAST - 确定性,除非与 日期时间、小日期时间或 sql_variant

    换句话说,您需要满足这些条件才能以确定性的方式使用它们

    例如当你创建一个表时

    CREATE TABLE [dbo].[deterministicTest](
        [intDate] [int] NULL,
        [dateDateTime] [datetime] NULL,
        [castIntToDateTime]  AS (CONVERT([datetime],[intDate],0)),
        [castDateTimeToInt]  AS (CONVERT([int],[dateDateTime],0)),
        [castIntToVarchar]  AS (CONVERT([varchar],[intDate],0))
    ) ON [PRIMARY]
    

    您可以在 castIntToVarchar 上应用索引,但如果您尝试将索引添加到 castDateTimeToInt 或 castIntToDateTime 您将收到以下错误:

    表 'dbo.deterministicTest' 中的列 'castDateTimeToInt'(castIntToDateTime) 不能用于索引或统计信息或作为分区键,因为它是非确定性的。

    因此,如果您想保持确定性,日期时间既不能用作 CONVERT 函数的源格式,也不能用作目标格式

    【讨论】:

    • 这意味着,当我使用 CAST 时,非确定性可以是确定性的,比如当我这样做时,比如“cast(field as int)”?
    • @Sung Meister,CAST(field AS INT) 是确定性的,输出仅由输入决定。但是,CAST(field AS DATETIME) 是不确定的,输出不仅取决于输入,还可能取决于外部因素,例如服务器如何配置为处理两位数的年份。
    • @Luke 如果“字段”是 dateTime 类型,它也将是非确定性的
    • @kristof,是的。我打算在我的评论中包含它,但字符用完了!
    【解决方案3】:

    一个例子:

    RAND(1)  // deterministic, always returns the same number
    

    对比:

    RAND()   // non-deterministic, returns new random number on each call
    

    请注意,这使用了 MSDN 文章对“确定性”一词的定义

    【讨论】:

    • +1 这也是我一直在寻找的例子。谢谢,尼尔。
    【解决方案4】:

    BOL 定义应为:

    ”确定性函数在任何时候使用一组特定的输入值(行)调用并给定数据库的相同状态时,总是在同一行上返回相同的结果。

    换句话说,确定性函数总是在其域中的任何特定固定值上返回相同的结果(在这种情况下,域是一行)。

    即使它们访问的数据库状态保持不变,每次使用一组特定的输入值(行)调用非确定性函数时,它们也可能返回不同的结果。

    在这种情况下是非确定性函数

    a) 每次调用时返回不同的值。

    b) 取决于它们所应用的行之外的值。

    a) 组示例:NEWID()、GETDATE()、GETUTDATE()、RAND(),未指定种子。

    b) 组的示例:使用 OVER 和 ORDER BY 子句指定时的 GET_TRANSMISSION_STATUS()、LAG()、RANK()、DENSE_RANK()、ROW_NUMBER()、NTILE()、SUM()。 ”

    请注意some authors use different definition of deterministic functions 可能会导致混淆。

    【讨论】:

      猜你喜欢
      • 2011-04-03
      • 2013-12-13
      • 2015-02-19
      • 2019-06-10
      • 1970-01-01
      相关资源
      最近更新 更多