Табличная функция (TVF) против просмотра - PullRequest
70 голосов
/ 10 февраля 2011

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

Ответы [ 2 ]

117 голосов
/ 10 февраля 2011

Встроенный 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  

Встроенные TVFs

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    

Многостраничные 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. Они вполне могут не оцениваться полностью (или даже вообще в некоторых случаях) или могут оцениваться несколько раз в других . Многоэтапные TVF всегда будут оцениваться и сохраняться в типе возвращаемой таблицы (в основном это табличная переменная)

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

0 голосов
/ 29 мая 2015

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