Sql Server Cte Vs Temp Table Vs Table Variable Performance Test
Link
Related
It appears that CTE's are the most efficient and fastest of the temporary result set options and even Temp Tables are better than Table Variables
Notes
-- CTE
WITH t (customerid, lastorderdate) AS
(SELECT customerid, max(orderdate)
FROM sales.SalesOrderHeader
GROUP BY customerid)
SELECT *
FROM sales.salesorderheader soh
INNER JOIN t ON soh.customerid=t.customerid AND soh.orderdate=t.lastorderdate
GO
-- Temporary table
CREATE TABLE #temptable (customerid [int] NOT NULL PRIMARY KEY, lastorderdate [datetime] NULL);
INSERT INTO #temptable
SELECT customerid, max(orderdate) as lastorderdate
FROM sales.SalesOrderHeader
GROUP BY customerid;
SELECT *
FROM sales.salesorderheader soh
INNER JOIN #temptable t ON soh.customerid=t.customerid AND soh.orderdate=t.lastorderdate
DROP TABLE #temptable
GO
-- Table variable
DECLARE @tablevariable TABLE (customerid [int] NOT NULL PRIMARY KEY, lastorderdate [datetime] NULL);
INSERT INTO @tablevariable
SELECT customerid, max(orderdate) as lastorderdate
FROM sales.SalesOrderHeader
GROUP BY customerid;
SELECT *
FROM sales.salesorderheader soh
INNER JOIN @tablevariable t ON soh.customerid=t.customerid AND soh.orderdate=t.lastorderdate
GO
Here are the updated queries which add a WHERE clause to each statement we tested above.
-- CTE
WITH t (customerid, lastorderdate) AS
(SELECT customerid, max(orderdate)
FROM sales.SalesOrderHeader
WHERE customerid=27604
GROUP BY customerid)
SELECT *
FROM sales.salesorderheader soh
INNER JOIN t ON soh.customerid=t.customerid AND soh.orderdate=t.lastorderdate
GO
--Temp table
CREATE TABLE #temptable (customerid [int] NOT NULL PRIMARY KEY, lastorderdate [datetime] NULL);
INSERT INTO #temptable
SELECT customerid, max(orderdate) as lastorderdate
FROM sales.SalesOrderHeader
WHERE customerid=27604
GROUP BY customerid;
SELECT *
FROM sales.salesorderheader soh
INNER JOIN #temptable t ON soh.customerid=t.customerid AND soh.orderdate=t.lastorderdate
DROP TABLE #temptable
GO
--Table variable
DECLARE @tablevariable TABLE (customerid [int] NOT NULL PRIMARY KEY, lastorderdate [datetime] NULL);
INSERT INTO @tablevariable
SELECT customerid, max(orderdate) as lastorderdate
FROM sales.SalesOrderHeader
WHERE customerid=27604
GROUP BY customerid;
SELECT *
FROM sales.salesorderheader soh
INNER JOIN @tablevariable t ON soh.customerid=t.customerid AND soh.orderdate=t.lastorderdate
GO
Backlinks