Screech
Links:
- Table Variables
- Table Variables In SQL Server 2019
- What’s Really Different About In Memory Table Variables?
- A Trick For Dealing With Table Variable Modification Performance
- Starting SQL: I Don’t Care How Many Rows Are In Your Table Variable
Going Further
If this is the kind of SQL Server stuff you love learning about, you’ll love my training. I’m offering a 75% discount to my blog readers if you click from here. I’m also available for consulting if you just don’t have time for that and need to solve performance problems quickly.
USE StackOverflow2013; EXEC dbo.DropIndexes; SET NOCOUNT ON; DBCC FREEPROCCACHE; GO CREATE INDEX whatever ON dbo.Posts (OwnerUserId) INCLUDE (Score); GO CREATE OR ALTER PROCEDURE dbo.TempTableTest (@Id INT) AS BEGIN SET NOCOUNT, XACT_ABORT ON; CREATE TABLE #t(i INT NOT NULL); INSERT #t ( i ) SELECT p.Score FROM dbo.Posts AS p WHERE p.OwnerUserId = @Id; END; GO CREATE OR ALTER PROCEDURE dbo.TableVariableTest (@Id INT) AS BEGIN SET NOCOUNT, XACT_ABORT ON; DECLARE @t TABLE (i INT NOT NULL); INSERT @t ( i ) SELECT p.Score FROM dbo.Posts AS p WHERE p.OwnerUserId = @Id; END; GO CREATE OR ALTER PROCEDURE dbo.TempTestWrapper (@TestProc sysname) AS BEGIN SET NOCOUNT, XACT_ABORT ON; DECLARE @rando int = ((ABS(CHECKSUM(NEWID())) % 21195018) + 1); /*this is the max id in posts for SO2013*/ IF @TestProc = N'TempTableTest' BEGIN EXEC dbo.TempTableTest @rando; END; IF @TestProc = N'TableVariableTest' BEGIN EXEC dbo.TableVariableTest @rando; END; END; GO /*Testing*/ EXEC dbo.TempTestWrapper @TestProc = 'TempTableTest'; EXEC dbo.TempTestWrapper @TestProc = 'TableVariableTest'; /* ostress -SSQL2019S -d"StackOverflow2013" -Q"EXEC dbo.TempTestWrapper @TestProc = 'TempTableTest';" -U"ostress" -P"ostress" -q -n300 -r1000 -o"C:\temp\crap" ostress -SSQL2019S -d"StackOverflow2013" -Q"EXEC dbo.TempTestWrapper @TestProc = 'TableVariableTest';" -U"ostress" -P"ostress" -q -n300 -r1000 -o"C:\temp\crap" */
I’ll just leave two additional use cases for table variables: they hold the inserted values after a rollback and, if you care about localization (for whatever reason, just as an example, your database has a different collation than your default sql installation), then the only way to go is via table variables.
Ah yeah, good point about the collation! Always a pain to troubleshoot/remember to add COLLATE clauses to temp tables.