Что это означает, что недетерминированные пользовательские функции могут использоваться детерминированным образом?

Согласно странице MSDN SQL BOL (книги в Интернете) в разделе Детерминированные и недетерминированные функции , недетерминированные функции можно использовать "детерминированным образом"

Следующие функции не всегда являются детерминированными, но их можно использовать в индексированных представлениях или индексах для вычисляемых столбцов, если они указаны детерминированным образом.

Что означает, что недетерминированные функции могут использоваться детерминированным образом?
Может ли кто-нибудь проиллюстрировать, как это можно сделать? и где вы бы это сделали?


person dance2die    schedule 02.04.2009    source источник


Ответы (4)


BOL фактически указывает:

Следующие функции не всегда являются детерминированными, но могут использоваться в индексированных представлениях или индексах для вычисляемых столбцов, если они определены детерминированным образом.

а затем ниже указывается, какие условия должны быть выполнены, чтобы сделать их детерминированными.

E.g.

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, вы получите следующую ошибку:

Столбец castDateTimeToInt (castIntToDateTime) в таблице dbo.deterministicTest нельзя использовать в индексе или статистике или в качестве ключа секции, поскольку он недетерминирован.

Таким образом, dateTime нельзя использовать ни в качестве исходного, ни в качестве целевого формата функции CONVERT, если вы хотите оставаться детерминированным.

person kristof    schedule 02.04.2009
comment
Это означает, что когда я использую CAST, который недетермичен, может быть детерминирован, скажем, когда я делаю, скажем, cast(field as int)? - person dance2die; 02.04.2009
comment
@Sung Meister, CAST (поле AS INT) является детерминированным, вывод определяется исключительно вводом. Однако CAST(поле AS DATETIME) не является детерминированным, выходные данные зависят не только от ввода, но также потенциально от внешних факторов, таких как то, как сервер настроен для обработки двузначных годов. - person LukeH; 02.04.2009
comment
@Luke также, если «поле» имеет тип dateTime, оно также будет недетерминированным. - person kristof; 02.04.2009
comment
@kristof, правда. Я хотел включить это в свой комментарий, но закончились символы! - person LukeH; 02.04.2009

То, что функция является детерминированной, означает, что она всегда гарантированно возвращает одно и то же выходное значение для одних и тех же входных аргументов.

Я предполагаю, что использование недетерминированной функции детерминированным образом означает, что вы гарантируете, что диапазон аргументов, которые вы передадите функции, таков, что возвращаемое значение будет детерминированным, т.е. зависит только от этих аргументов.

Что это означает на практике, зависит от того, что делает функция и в каком смысле она недетерминирована.

person Tor Haugen    schedule 02.04.2009
comment
Дэн! Я должен получить более быстрый триггерный палец! - person Daniel Pratt; 02.04.2009
comment
На самом деле BOL перечисляет все функции, которые не всегда детерминированы, и указывает, когда они детерминированы, а когда нет. Другие функции либо всегда детерминированы, либо всегда недетерминированы. - person kristof; 02.04.2009

Пример:

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

против:

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

Обратите внимание, что здесь используется определение слова «детерминированный» в статье MSDN.

person Community    schedule 02.04.2009
comment
+1 это был пример, который я тоже искал. Спасибо, Нил. - person dance2die; 02.04.2009

Определения BOL должны гласить:

«Детерминированные функции всегда возвращают один и тот же результат в одной и той же строке всякий раз, когда они вызываются с определенным набором входных значений (строкой) и при одном и том же состоянии базы данных.

Другими словами, детерминированные функции всегда возвращают один и тот же результат для любого конкретного фиксированного значения из своего домена (в данном случае домен — это строка).

Недетерминированные функции могут возвращать разные результаты каждый раз, когда они вызываются с определенным набором входных значений (строкой), даже если состояние базы данных, к которому они обращаются, остается прежним.

В этом случае недетерминированные функции

а) Возвращать разные значения при каждом вызове.

б) Зависят от значений вне строки, к которой они применяются.

Примеры группы a): NEWID(), GETDATE(), GETUTDATE(), RAND() без указания начального числа.

Примеры группы b): GET_TRANSMISSION_STATUS(), LAG(), RANK(), DENSE_RANK(), ROW_NUMBER(), NTILE(), SUM(), если они указаны с предложениями OVER и ORDER BY. ”

Обратите внимание, что некоторые авторы используют другое определение детерминированных функций что может привести к путанице.

person Pavel Nefyodov    schedule 02.10.2014