principleModerate
Performance of Inline-TVF vs. Views
Viewed 0 times
inlineviewsperformancetvf
Problem
I have a database where i am using inline TVFs (table value functions) instead of views. For example, I might have two tables called [car model] and [car manufacturer] that I'm joining together inside the TVF [fnCarBrands].
These TVFs are then called by other TVFs to do further processing and reporting. So I might take my function [fnCarBrands] and join to the table [Purchase Year] to form a function [fnCarBrandHistory]. And so on for several layers of TVFs.
I could probably get the same functionality using views, since my inline TVFs are really just joins of tables and other TVFs.
How does the performance of inline TVFs written in this way compare with views?
These TVFs are then called by other TVFs to do further processing and reporting. So I might take my function [fnCarBrands] and join to the table [Purchase Year] to form a function [fnCarBrandHistory]. And so on for several layers of TVFs.
I could probably get the same functionality using views, since my inline TVFs are really just joins of tables and other TVFs.
How does the performance of inline TVFs written in this way compare with views?
Solution
The query optimizer treats an inline table valued function exactly like a view:
A multi-statement table-valued function is run more like a stored procedure. They typically have to be executed multiple times, rather than be folded into the main query:
CREATE FUNCTION dbo.InlineUdf(@arg1 int)
RETURNS TABLE
AS
RETURN
(
... your query here ...
);A multi-statement table-valued function is run more like a stored procedure. They typically have to be executed multiple times, rather than be folded into the main query:
CREATE FUNCTION dbo.MultiStatementUdf (@col1 int)
RETURNS @result TABLE
(
id int primary key NOT NULL,
...
)
AS
BEGIN
DECLARE @var1 int
set @var1 = 42
INSERT @result
SELECT ...
RETURN
END;Code Snippets
CREATE FUNCTION dbo.InlineUdf(@arg1 int)
RETURNS TABLE
AS
RETURN
(
... your query here ...
);CREATE FUNCTION dbo.MultiStatementUdf (@col1 int)
RETURNS @result TABLE
(
id int primary key NOT NULL,
...
)
AS
BEGIN
DECLARE @var1 int
set @var1 = 42
INSERT @result
SELECT ...
RETURN
END;Context
StackExchange Database Administrators Q#22459, answer score: 12
Revisions (0)
No revisions yet.