Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 udf, многострочная или инлайн  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
пишу табличную функцию, в зависимости от параметра происходит выборка из разных таблиц.
динамика отпадает, поэтому остаётся два варианта:
1) инлайн функция с объединением всех вариантов UNION ALL и условием выбора таблицы в WHERE;
2) многострочная табличная функция с кучей IF-ов по тому же условию выбора.
по плану первый вариант выдаёт гораздо больше IO (сканы по всем таблицам), но на тестовых данных по времени он получается лучше раза в полтора.
всегда ли первый вариант будет выигрышным?

+ заготовка

1)
CREATE FUNCTION [dbo].[fn_TableSelector] (@tbl varchar(10), @dt datetime)
RETURNS TABLE
AS
RETURN (
	SELECT id, val
	FROM  table1 v
	WHERE dt = (
		SELECT MAX(DT) dt
		FROM table1 vv
		WHERE DT <= @dt AND v.id = vv.id
	) AND @tbl = 'TBL1'
		
	UNION ALL		

	SELECT id, val
	FROM  table2 v
	WHERE dt = (
		SELECT MAX(DT) dt
		FROM table2 vv
		WHERE DT <= @dt AND v.id = vv.id
	) AND @tbl = 'TBL2'

	UNION ALL

	<... штук 10 таблиц разного размера ...>
	
);
2)
CREATE FUNCTION [dbo].[fn_TableSelector] (@tbl varchar(10), @dt datetime)
RETURNS @TMP TABLE ( id, val )
AS
BEGIN


	IF @tbl = 'TBL1'
		INSERT INTO @TMP (id, val)
		SELECT id, val
		FROM  table1 v
		WHERE dt = (
			SELECT MAX(DT) dt
			FROM table1 vv
			WHERE DT <= @dt AND v.id = vv.id
		)
		

	IF @tbl = 'TBL2'
		INSERT INTO @TMP (id, val)
		SELECT id, val
		FROM  table2 v
		WHERE dt = (
			SELECT MAX(DT) dt
			FROM table2 vv
			WHERE DT <= @dt AND v.id = vv.id
		)

	RETURN;

	<... штук 10 таблиц разного размера ...>
END
8 июл 11, 13:16    [10945094]     Ответить | Цитировать Сообщить модератору
 Re: udf, многострочная или инлайн  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
зависит от кол-ва записей, возвращаемых функцией
если много - инлайн, мало - табличная

совет: объявляйте primary key на возвращаемой таблице
8 июл 11, 13:44    [10945350]     Ответить | Цитировать Сообщить модератору
 Re: udf, многострочная или инлайн  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
на всех опробованных входных данных оказалось, что инлайн быстрее. в многострочной функции происходит вставка в табличную перменную, что не позволяет плану распараллеливатся, в отличие от инлайновой, и поэтому (как я предполагаю) у многострочной elapsed time получается больше, несмотря на то что cpu time меньше. исходные таблицы секционированы по времени

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


ura, насчёт пк спасибо
8 июл 11, 15:29    [10946347]     Ответить | Цитировать Сообщить модератору
 Re: udf, многострочная или инлайн  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Shakill
на всех опробованных входных данных оказалось, что инлайн быстрее


значит или данных много переливаете или к результату эффективный фильтр применяете
8 июл 11, 18:05    [10947803]     Ответить | Цитировать Сообщить модератору
 Re: udf, многострочная или инлайн  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Shakill
по плану первый вариант выдаёт гораздо больше IO (сканы по всем таблицам), но на тестовых данных по времени он получается лучше раза в полтора.
Не надо сравнивать груши с коровами.
Не всегда можно разжевать правильно, поэтому то что выдаёт план не всегда есть истина в первой инстанции. Пользоваться надо своей головой, а не только советами железного брата.

Например, есть StartUp Filter в плане, который означает, что идущий за ним кусок плана запустится только при выполнении условия. В данном случае @tbl сработает только для одного куска по логике. Но план вам выдаст сумму по всем.
Это я не говорю о том, что компилируемые вещи (процедуры табличные функции) вообще тяжело предсказывать.
Вероятность что будут многократно пользоваться функцией (параметризованными VIEW) с фильтрами (WHERE) может быть очень даже большая, поэтому придерживайтесь декларативного программирования (inline) не прогадаете. А если вдруг в одном двух местах нужно будет оптимизнуть вот тогда и экспериментируйте с другими вариантами, делов-то.
9 июл 11, 16:49    [10950480]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить