2015-07-23 2 views
0

Я знаю, что производная таблица и общее табличное выражение (CTE) не сохраняются. Они живут в памяти до конца внешнего запроса. Каждый вызов является повторным исполнением.Сохраняются ли функции SQL Server, такие как встроенные функции табличных значений?

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

ответ

0

Do функции, такие как встроенные таблицы функций сохраняются

НЕТ, если вы видите, синтаксис table valued function возвращает результат select statement в сущности, и поэтому он не хранит неправдоподобные данные в любом месте (такой же, как в поле зрения). Итак, нет никакого вопроса о создании индекса на нем, поскольку данные не сохраняются.

Если вы не храните эти извлеченные данные в другой таблице, как показано ниже, а затем вы можете создать индекс/другой материал в этой тестовой таблице;

SELECT * FROM yourInlineTableValuedFunction(parameter) 
INTO TestTable; 
0

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

Я бы не сказал, что каждый вызов CTE является повторным исполнением, поскольку SQL-сервер может свободно решать, как выполнить запрос, если результаты верны.

Для каждого заявления UDF каждый из вызовов (по крайней мере, в версиях до 2014 года) является отдельным исполнением, насколько я знаю, каждый раз и не кэшируется в том смысле, который, как вы предполагаете, вы имеете в виду.

+0

Я имел в виду кеш и постоянство для эффективного повторного использования. Тогда какой улов встроенных табличных функций над CTE или view, за исключением того факта, что для CTE нам нужно повторять код каждый раз, а для функций нам не нужно? Я вижу, что представления и функции хранятся как объекты, поэтому хранятся только их определения кода, а не данные? – Kenny

+0

@Kenny Я предполагаю, что внутренне они, вероятно, легче оптимизировать, чем представления, потому что у вас есть параметры, а не соединения из запроса в представление, что может привести к несоответствию типов данных и т. Д. Даже Microsoft говорит: «Встроенные функции могут использоваться для достижения функциональность параметризованных представлений ". в документации 2008 года: https://technet.microsoft.com/en-us/library/ms189294%28v=sql.105%29.aspx по сравнению с CTE, тогда функции предоставляют возможность повторного использования кода, CTE - просто для этого одного заявления. –

0

Можем ли мы проиндексировать встроенную функцию, ориентированную на таблицу?

Нет, но если вы сделаете стол в таблице темп, убедитесь, что вы можете индексировать и ускоряться. Накладные расходы на создание временной таблицы будут более чем окупаться в улучшенном индексированном доступе, кэшировании и, в зависимости от вашего использования, повторном использовании одной и той же таблицы temp в многопользовательском сценарии.

Смежные вопросы