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