Можно ли использовать функции поиска по таблицам в скалярной функции? - PullRequest
1 голос
/ 27 октября 2010

В нашем случае у нас есть некоторая бизнес-логика, которая просматривает несколько таблиц в определенном порядке, так что используется первое ненулевое значение из одной таблицы.Хотя поиск не сложен, но для его выполнения требуется несколько строк кода SQL.Я читал о скалярных функциях в SQL Server, но не знаю, затрагивает ли меня проблема повторной компиляции, чтобы сделать это менее удобным способом.

Так каково общее эмпирическое правило?

Вы бы предпочли что-то вроде

select id, udfGetFirstNonNull(id), from mytable

Или табличные функции лучше скалярных?

select id, 
  (select firstNonNull from udfGetFirstNonNull(id)) as firstNonNull
from myTable

Ответы [ 3 ]

1 голос
/ 27 октября 2010

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

1 голос
/ 27 октября 2010

Скалярный udf будет искать каждую строку в myTable, которая может увеличиваться экспоненциально дольше по мере увеличения данных.Эффективно у вас есть КУРСОР.Если у вас есть несколько строк, это, конечно, не имеет значения.

Я делаю то же самое, где не ожидаю много строк (более нескольких сотен).

Тем не менее, я бы рассмотрел функцию табличного значения, где я поместил здесь «foo»."foo" также может быть и CTE в UDF (не проверено):

select id, 
  (select firstNonNull from udfGetFirstNonNull(id)) as firstNonNull
 from
    myTable M
    JOIN
    (SELECT value, id as firstNonNull
     FROM OtherTable
     WHERE value IS NOT NULL
     GROUP BY id
     ORDER BY value) foo ON M.id = foo.id
1 голос
/ 27 октября 2010

Ваш первый запрос в порядке.В одном месте, где я работаю, абсолютно одержимы скорость и оптимизация, и они активно используют UDF.

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