Детерминированные скалярные функции - PullRequest
0 голосов
/ 19 ноября 2008

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

Без индексации будет медленный запуск запросов, которые мне нужны.

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

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

Ответы [ 3 ]

2 голосов
/ 20 ноября 2008

Попробуйте:

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

или

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

Извините, IIRC, SQL Server 2000 не допускает недетерминированные пользовательские функции.

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

1 голос
/ 20 ноября 2008

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

0 голосов
/ 20 ноября 2008

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

Согласно MSDN конвертировать:

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

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

Тип цели - sql_variant, а тип источника недетерминированный.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...