Разница между скалярными, табличными и агрегатными функциями в SQL server?

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

3 ответов


Скалярной Функции

скалярные функции (иногда называемые пользовательскими функциями / UDFs) возвращают одно значение как возвращаемое значение, а не как результирующий набор, и могут использоваться в большинстве мест в запросе или SET заявление, за исключением FROM предложение (и, возможно, другие места?). Кроме того, скалярные функции можно вызвать через EXEC, как и хранимые процедуры, хотя не так много случаев использовать эту способность (для получения более подробной информации об этой способности, пожалуйста см. мой ответ на следующий вопрос о DBA.Клиент StackExchange: почему скалярные функции должны выполнять разрешение, а не выбирать?). Они могут быть созданы как в T-SQL, так и в SQLCLR.

  • T-SQL (UDF): эти скалярные функции, как правило, проблемы с производительностью, потому что они обычно выполняются для каждой строки (или по этой) и всегда запрещать планы параллельного выполнения.
  • среде sqlclr (UDF): эти скалярные функции также обычно выполняются для каждой возвращенной или отсканированной строки, но есть два важных преимущества перед T-SQL UDFs:

    • начиная с SQL Server 2012, возвращаемые значения могут быть постоянно свернуты в план выполнения, если UDF не делает любой доступ к данным, и если он помечен как IsDeterministic = true. В этом случае функция не будет выполняться для каждой строки.
    • скалярные функции SQLCLR можете работа в параллельных планах ( ) если они этого не сделают любой доступ к базе данных.

Табличные Функции

табличные функции (TVFs) возвращают результирующие наборы и могут использоваться в FROM предложения JOIN или CROSS APPLY / OUTER APPLY любого запроса, но в отличие от простых представлений, не может быть целью каких-либо операторов DML (INSERT / UPDATE / DELETE). Они также могут быть созданы как в T-SQL, так и в SQLCLR.

  • T-SQL MultiStatement (TVF): эти TVFs, как следует из их названия, могут иметь несколько операторов, подобных хранимой процедуре. Любые результаты, которые они собираются вернуть, хранятся в переменной таблицы и возвращаются в самом конце; это означает, что ничего не возвращается, пока функция не завершит обработку. Предполагаемое количество строк, которые они вернут, как сообщается оптимизатору запросов (что влияет на план выполнения), зависит от версии SQL Server:

    • до SQL Server 2014: они всегда сообщают 1 (да, только 1) строку.
    • SQL Server 2014 и 2016: они всегда сообщают 100 строк.
    • начиная с SQL Server 2017: по умолчанию сообщается 100 строк, но при некоторых условиях количество строк будет довольно точным (на основе текущей статистики) благодаря новому Чередуются Исполнение характеристика.
  • T-SQL Inline (iTVF): эти TVFs могут быть только один оператор, и этот оператор является полным запросом, как и представление. И на самом деле встроенные TVFs-это, по сути, представление, которое принимает входные параметры для использования в запросе. Они также не кэшируют свой собственный план запроса, поскольку их определение помещается в запрос, в котором они используются (в отличие от других объектов, описанных здесь), поэтому они могут быть оптимизированы намного лучше, чем другие типы TVFs ( ). Эти TVFs работают довольно хорошо и предпочтительны, если логика может быть обработана в одном запрос.

  • SQLCLR (TVF): эти TVFs похожи на T-SQL MultiStatement TVFs в том, что они создают весь результирующий набор в памяти (даже если это файл подкачки / страницы), прежде чем выпустить все это в самом конце. Предполагаемое число строк, которые они вернут, как сообщается оптимизатору запросов (который влияет на план выполнения), всегда составляет 1000 строк. Учитывая, что фиксированный счетчик строк далек от идеала, Пожалуйста, поддержите мой запрос, чтобы разрешить указание количество строк: разрешить TVFs (T-SQL и SQLCLR) предоставлять пользовательские оценки строк оптимизатору запросов

  • потоковая передача SQLCLR (sTVF): эти TVFs позволяют использовать сложный C# / VB.NET код так же, как обычные Sqlclr TVFs, но особенные в том, что они возвращают каждую строку в вызывающий запрос по мере их создания ( ). Эта модель позволяет вызывающему запросу начать обработку результатов сразу после отправки первого, поэтому запрос не требуется чтобы дождаться завершения всего процесса функции, прежде чем она увидит какие-либо результаты. И он требует меньше памяти, так как результаты не сохраняются в памяти до завершения процесса. Предполагаемое число строк, которые они вернут, как сообщается оптимизатору запросов (который влияет на план выполнения), всегда составляет 1000 строк. Учитывая, что фиксированное количество строк далеко от идеала, Пожалуйста, поддержите мой запрос, чтобы разрешить указание количества строк:разрешить TVFs (T-SQL и SQLCLR) предоставлять пользовательские оценки строк для оптимизатора запросов

Агрегатные Функции

пользовательские агрегаты (UDA) агрегаты, похожие на SUM(), COUNT(), MIN(), MAX(), etc. и, как правило, требуют GROUP BY предложения. Они могут быть созданы только в SQLCLR, и эта возможность была введена в SQL Server 2005. Кроме того, начиная с SQL Server 2008, UDAs были расширены, чтобы разрешить несколько входных параметров ( ). Одна особенность недостаток заключается в том, что нет знаний о порядке строк в группе, поэтому создание бегущей суммы, которая была бы относительно легкой, если бы заказ мог быть гарантирован, невозможно в SAFE сборка.


Смотрите также:


скалярная функция возвращает одно значение. Это может даже не быть связано с таблицами в вашей базе данных.

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

агрегатно-значная функция возвращает вычисление по строкам таблицы - например, суммирование значений.


скалярной функции

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

табличная функция

немного отличается по сравнению с вышеизложенным. Возвращает табличное значение. Внутри тела этой функции вы пишете запрос, который вернет точную таблицу. Например:

CREATE FUNCTION <function name>(parameter datatype)

RETURN table

AS

RETURN

(

-- *write your query here* ---

)

обратите внимание, что нет BEGIN & END заявления здесь.

Агрегатные Функции

включает встроенные функции, которые используются вместе с GROUP предложения. Например: SUM(),MAX(),MIN(),AVG(),COUNT() являются агрегатными функциями.