Is there a benefit to using CTE's
(common table expressions
) instead of using temp tables
.
I went through performance testing between both of them, but I cant find much difference between them.
What are some pros and cons of using CTE'S
?
Temp Tables are physically created in the tempdb database. These tables act as the normal table and also can have constraints, an index like normal tables. CTE is a named temporary result set which is used to manipulate the complex sub-queries data. This exists for the scope of a statement.
The Name of a temp variable can have a maximum of 128 characters and a Temp Table can have 116 characters. Temp Tables and Temp Variables both support unique key, primary key, check constraints, Not null and default constraints but a Temp Variable doesn't support Foreign Keys.
A view exists only for a single query. Each time you use the name of a view, its table is recreated from existing data. A temporary table exists for the entire database session in which it was created. A view is automatically populated with the data retrieved by the query that defines it.
A CTE can be referenced multiple times in the same query. So CTE can use in recursive query. Derived table can't referenced multiple times. Derived table can't use in recursive queries.
Probably the biggest difference between a CTE and a temp table, is that the CTE has an execution scope of a single SELECT, INSERT, UPDATE, DELETE, or CREATE VIEW statement.
Essentially you can't reuse the CTE, like you can with temp tables.
From the documentation
A common table expression (CTE) can be thought of as a temporary result set that is defined within the execution scope of a single SELECT, INSERT, UPDATE, DELETE, or CREATE VIEW statement. A CTE is similar to a derived table in that it is not stored as an object and lasts only for the duration of the query. Unlike a derived table, a CTE can be self-referencing and can be referenced multiple times in the same query.
A CTE can be used to:
Create a recursive query. For more information, see Recursive Queries Using Common Table Expressions.
Substitute for a view when the general use of a view is not required; that is, you do not have to store the definition in metadata.
Enable grouping by a column that is derived from a scalar subselect, or a function that is either not deterministic or has external access.
Reference the resulting table multiple times in the same statement.
CTE : CTE stands for Common Table expressions. It was introduced with SQL Server 2005. It is used to store the result of a complex sub-query on temporary bases. Its life is limited to the current query. It is defined by using WITH statement. It mainly used for recursive call.
Example
;with myCTE as ( select ParentLevel, ParentID, ChildID from MHA where ChildID = 1 UNION ALL select MHA.ParentLevel, MHA.ParentID, MHA.ChildID from MHA inner join myCTE on MHA.ParentID = myCTE.ChildID where MHA.ParentID <> 0 )
(error)
select top (5) * from myCTE
so in above example, I have create CTE name as myCTE , that can only be used in above query (I can not use myCTE out side of above query)
TEMP: It is also used to store the result of query on temporary bases.But Its life is limited to the current session. It is defined by using #. It does not support recursive.
Example:
select * into #tempTable from MHA
In above query I have created temp table, now I can use it temp table out side of this query but with in session. See below
(no error)
select top (5) * from #tempTable
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With