Функция с табличным значением (TVF) против представления


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

2 64

2 ответа:

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

вид

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  

Встроенной Возвращающей Табличное Значение Функции

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    

Несколькими Инструкциями Возвращающие Табличное Значение Функции

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    

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

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

Я обнаружил, что соединения с MultiStatement TVFs работают намного лучше, чем представления, когда 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