SQL * Server Постоянные значения для пользовательских скалярных функций - производительность - PullRequest
1 голос
/ 10 ноября 2010

У меня есть запрос, который довольно хорошо работает, когда выполняется так:

SELECT YADAYADA FROM MYTABLE WHERE FVAL <= 100 AND TVAL >= 100

Поскольку существует индекс для (FVAL, TVAL), запрос является полностью оптимальным, поскольку поиск по некластерному индексу для всего запроса.

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

SELECT YADAYADA FROM MYTABLE WHERE FVAL <= dbo.myVal() AND TVAL >= dbo.myVal()

дает неоптимальные результаты - план запроса больше не работает как поиск по индексу, а вместо этого настаивает на поиске, а затем фильтрации , что, очевидно, НАМНОГО медленнее - даже если в этом случае моя функция определяется как возвращающая постоянное значение в этом действительно простом случае.

Я пытался использовать предложение BETWEEN - не лучше.Я пробовал табличные функции, не лучше (на самом деле, план запросов становится все более сложным).

Есть ли любой способ убедить SQL * Server в том, что вы, приятель,это значение константа , которое мы получаем, и соответственно оптимизировать план ??

Ответы [ 2 ]

1 голос
/ 10 февраля 2012

SQL Server пытается быть умным и предлагает значения для запроса, но иногда разработчик знает лучше.

Следующая концепция должна помочь вам

DECLARE @fval INT
DECLARE @tval INT
SET @fval = dbo.myVal()
SET @tval = dbo.myVal()

SELECT YADAYADA FROM MYTABLE WHERE FVAL <= @fval AND TVAL >= @tval
OPTION (OPTIMIZE FOR(@fval= 100, @tval = 100))
1 голос
/ 10 ноября 2010

Лучшее, что вы могли бы сделать, это объявить переменную в запросе, присвоить значение переменной UDF этой переменной, а затем использовать переменную в запросе.

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