Детерминированные скалярные функции

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

Без индексации это будет способ замедлить выполнение необходимых мне запросов.

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

Есть ли в SQL Server Management Studio какой-либо инструмент, который скажет мне, является ли определяемая пользователем функция детерминированной, или мне просто нужно отследить все системные функции, которые я использую, чтобы выяснить, какие из них недетерминированы, и найти другие способы написать свой код без них?


person Tony Peterson    schedule 19.11.2008    source источник


Ответы (3)


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

person Dave Costa    schedule 19.11.2008

Пытаться:

SELECT  *
FROM    INFORMATION_SCHEMA.ROUTINES
WHERE   IS_DETERMINISTIC = 'NO'
        AND ROUTINE_TYPE = 'FUNCTION'

or

SELECT OBJECTPROPERTY(OBJECT_ID('schemaname.functionname'), 'IsDeterministic')

К сожалению, IIRC, SQL Server 2000 не допускает недетерминированных UDF.

Индексирование недетерминированного столбца довольно глупо - в конце концов, если его значение не зависит строго от параметров, оно не будет очень полезным, если оно изменится для вас всех волей-неволей, особенно если оно используется в индексе для найти вещи!

person Cade Roux    schedule 19.11.2008
comment
Ваше первое утверждение кажется неправильным на основании следующего: msdn.microsoft.com/ en-us / library / ms187440.aspx, msdn.microsoft. ru / en-us / library / ms178091.aspx. Например, UDF, вызывающая CURRENT_TIMESTAMP, будет недетерминированной. - person Dave Costa; 20.11.2008
comment
Вы правы - это должно быть остаток знаний из SQL Server 2000, который не допускал недетерминированных функций в UDF. - person Cade Roux; 20.11.2008
comment
Моя функция должна быть детерминированной. Это расчет, который в основном включает конкатенацию строк, DateParts и операторы case - person Tony Peterson; 20.11.2008

Я понял, почему моя функция недетерминирована. Он основан на операторах Convert с кодами стиля 1, 3, а затем другими кодами выше 100.

Согласно msdn Convert:

Детерминированный, если не существует одно из этих условий:

Тип источника - sql_variant.

Целевой тип - sql_variant, а его исходный тип - недетерминированный.

Исходный или целевой тип - это datetime или smalldatetime, другой исходный или целевой тип - это символьная строка, и указан недетерминированный стиль. Чтобы быть детерминированным, параметр стиля должен быть константой. Кроме того, стили меньше или равные 100 являются недетерминированными, за исключением стилей 20 и 21. Стили больше 100 являются детерминированными, за исключением стилей 106, 107, 109 и 113.

person Tony Peterson    schedule 20.11.2008