Функция с табличным значением (TVF) против представления
в чем разница между табличными функциями и представлениями? Есть ли что-то, что вы можете сделать с 1, что трудно или невозможно сделать с другим? Или разница заключается в эффективности?
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. Они вполне могут быть оценены не полностью (или даже вообще в некоторых случаях) или может быть оценена несколькими раз в других. Несколькими инструкциями возвращающие табличное значение функции всегда будут оценены и сохранены в тип возвращаемого стол (в основном табличная переменная)
Я обнаружил, что соединения с 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