6

According to MSDN SQL BOL (Books Online) page on Deterministic and Nondeterministic Functions, non-deterministic functions can be used "in a deterministic manner"

The following functions are not always deterministic, but can be used in indexed views or indexes on computed columns when they are specified in a deterministic manner.

What does it mean by non-deterministic functions can be used in a deterministic manner?
Can someone illustrate how that can be done? and where you would do so?

4

4 に答える 4

9

関数が決定論的であるということは、同じ入力引数に対して常に同じ出力値を返すことが保証されていることを意味します。

非決定論的関数を決定論的方法で使用するということは、関数に渡す引数の範囲が、戻り値が決定論的であるようにすることを意味すると思います。それらの議論にのみ依存します。

これが実際に意味することは、関数が何をするか、そしてどのようにそれが非決定論的であるかに依存します。

于 2009-04-02T13:06:29.467 に答える
9

例:

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

対:

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

これは、「決定論的」という言葉の MSDN 記事の定義を使用していることに注意してください。

于 2009-04-02T13:12:07.753 に答える
5

BOLは実際に次のように述べています。

次の関数は常に決定論的であるとは限りませんが、決定論的方法で指定されている場合は、インデックス付きビューまたは計算列のインデックスで使用できます。

次に、その下に、決定論的にするために満たす必要のある条件を示します。

例えば

CAST-datetime、smalldatetime、または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)は、非決定論的であるため、インデックスや統計、またはパーティションキーとして使用できません。

したがって、決定論的であり続けたい場合は、dateTimeをCONVERT関数のソース形式またはターゲット形式として使用することはできません。

于 2009-04-02T13:06:47.923 に答える
0

BOL の定義は次のとおりです。

決定論的関数は、特定の一連の入力値 (行) を指定して呼び出され、データベースの状態が同じである場合は常に、同じ行に対して同じ結果を返します。

つまり、決定論的関数は、そのドメイン (この場合、ドメインは行) から特定の固定値に対して常に同じ結果を返します。

非決定論的関数は、アクセスするデータベースの状態が同じままであっても、特定の入力値 (行) のセットで呼び出されるたびに異なる結果を返す場合があります。

この場合、非決定的関数

a) 呼び出すたびに異なる値を返す。

b) 適用された行の外側の値に依存します。

グループ a) の例: シードが指定されていない NEWID()、GETDATE()、GETUTDATE()、RAND()。

グループ b) の例: GET_TRANSMISSION_STATUS()、LAG()、RANK()、DENSE_RANK()、ROW_NUMBER()、NTILE()、SUM() (OVER および ORDER BY 句で指定した場合)。」</p>

一部の作成者は決定論的関数の異なる定義を使用しているため、混乱を招く可能性があることに注意してください。

于 2014-10-02T13:58:28.187 に答える