Подтвердить что ты не робот

Табличная функция (TVF) против представления

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

4b9b3361

Ответ 1

Безсмертный встроенный TVF и не материализованный вид очень похожи. Ниже перечислены некоторые функциональные отличия, которые spring для ума.

представления

Accepts Parameters               - No
Expanded out by Optimiser        - Yes
Can be Materialized in advance   - Yes (through indexed views)
Is Updatable                     - Yes 
Can contain Multiple Statements  - No
Can have triggers                - Yes
Can use side-effecting operator  - Yes  

Встроенные TVF

Accepts Parameters               - Yes
Expanded out by Optimiser        - Yes
Can be Materialized in advance   - No
Is Updatable                     - Yes
Can contain Multiple Statements  - No
Can have triggers                - No
Can use side-effecting operator  - No    

MultiStatement TVFs

Accepts Parameters               - Yes
Expanded out by Optimiser        - No
Can be Materialized in advance   - No
Is Updatable                     - No
Can contain Multiple Statements  - Yes
Can have triggers                - No
Can use side-effecting operator  - No    

В представлениях времени выполнения и встроенных TVF оба встраиваются и обрабатываются аналогично производным таблицам или CTE. Они могут не оцениваться полностью (или даже вообще в некоторых случаях) или могут быть оценены несколько раз в других. Multistatement TVF всегда будут оцениваться и сохраняться в типе таблицы возврата (в основном, переменной таблицы)

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

Ответ 2

Я обнаружил, что соединения с MultiStatement TVF работают намного лучше, чем Views, когда PK указан в таблице возврата функции.

CREATE FUNCTION [FORMREQS].[fnGetFormsStatus] ()
RETURNS

/* Create a PK using two of the columns */
@Indexed TABLE (
    [OrgID] [char](8) NOT NULL,
    [PkgID] [int] NOT NULL,
    [FormID] varchar(5) NOT NULL,
    PRIMARY KEY CLUSTERED(OrgID, PkgID) 
)
AS
BEGIN
INSERT @Indexed SELECT OrgID, PkgID, FormID FROM FormsTable

RETURN

END