Introduction: Why Temporary Structures Matter in SQL Server

SQL Server provides several ways to store temporary data: temp tables, global temp tables, and table variables. Many developers use them without understanding how they behave internally, especially how they affect execution plans, statistics, locking, and tempdb usage. Choosing the wrong one can slow down queries, increase CPU usage, or even cause blocking across sessions.
This guide breaks down the differences so you can make smarter performance decisions.
What Are Temp Tables?
Temp tables (created with #MyTable) are local to the current session and stored physically in tempdb.
Characteristics
- Exist only for the session or stored procedure
- Support indexes, constraints, and statistics
- Can store large volumes of data efficiently
- Fully participate in SQL Serverās optimizer
Creation Example
CREATE TABLE #Employees
(
EmpID INT,
Name NVARCHAR(100)
);
Temp tables behave like normal tables but disappear automatically when the session ends.
What Are Global Temp Tables?
Global temp tables use double hash marks (##MyTable) and are visible to all sessions.
Key Characteristics
- Temporary, but shared across connections
- Useful for data exchange across sessions
- Dropped when the last session referencing it ends
- Must be carefully named to avoid collisions
Example
CREATE TABLE ##TempSales
(
OrderID INT,
Amount DECIMAL(10,2)
);
Global temp tables behave most like regular tables, but their scope is server-wide.
What Are Table Variables?
Table variables are declared with an @ prefix and typically used inside functions or small operations.
Key Characteristics
- Lifetime exists within the batch or function
- Stored in tempdb (not memory as many assume)
- Do not support full statistics
- Poor cardinality estimation for large datasets
- Great for small row counts
Example
DECLARE @Orders TABLE
(
OrderID INT,
Amount DECIMAL(10,2)
);
Table variables are lightweight but not always efficient.
Execution Behavior: Temp Table vs Global Temp Table vs Table Variable
| Aspect | Temp Table | Global Temp Table | Table Variable |
|---|---|---|---|
| Stored In | tempdb | tempdb | tempdb |
| Scope | Session | Server-wide | Batch / Proc |
| Statistics | Yes | Yes | Limited |
| Indexing | Full | Full | Limited |
| Transaction Support | Full | Full | Limited |
| Best For | Mediumālarge data | Cross-session sharing | Small datasets |
Performance Considerations of Temp Tables
Temp tables are usually the most optimizer-friendly temporary structure.
Advantages
- Full statistics help the engine estimate row counts accurately
- Good join performance
- Ideal for large operations or complex transformations
- Indexing improves speed dramatically
Typical Use Cases
- ETL pipelines
- Stored procedures with heavy logic
- Multi-step calculations
Performance Considerations of Global Temp Tables
Global temp tables behave like regular temp tables, but with wider visibility.
Advantages
- Ideal for loading data once and using across multiple sessions
- Helpful in long-running reporting pipelines
- Good for shared caching scenarios
Drawbacks
- Risk of naming conflicts
- Potential blocking across sessions
- Must handle concurrency carefully
Performance Considerations of Table Variables
Table variables often perform worse for larger datasets due to bad statistics.
Key Limitations
- SQL Server assumes 1 row unless using modern cardinality estimation
- Joins perform poorly due to missing statistics
- No automatic indexing (must declare inline)
Best Use Cases
- Small tables (under 100 rows)
- Parameter passing
- Conditional logic where indexing isnāt needed
Statistics & Query Optimization Differences
Temp Tables
- Have statistics that auto-update
- Optimizer produces high-quality plans
Table Variables
- Historically had no statistics
- Newer SQL versions generate limited stats, but still inferior
- Can cause inefficient joins and scans
Global Temp Tables
- Same statistics capability as temp tables
- But impacted by concurrency
Real Execution Examples
Example: Temp Table is Faster
CREATE TABLE #Temp (ID INT);
INSERT INTO #Temp SELECT TOP 500000 ID FROM BigTable;
SELECT t.*
FROM #Temp t
JOIN Orders o ON t.ID = o.CustomerID;
Temp table wins because statistics help generate better join plans.
Example: Table Variable is Faster
DECLARE @Ids TABLE (ID INT);
INSERT INTO @Ids VALUES (1), (2);
SELECT *
FROM Orders
WHERE CustomerID IN (SELECT ID FROM @Ids);
For tiny datasets, a table variable reduces overhead.
Global Temp Tables in Multi-User Environments
Global temp tables shine when shared access is required.
Challenges
- Naming collisions (
##Tempalready exists) - Blocking when multiple sessions modify the table
- Cleanup timing depends on session connections
Best Practices
- Use unique prefixes (
##RptSession_123) - Avoid heavy writes from multiple sessions
- Monitor with
sys.objectsin tempdb
Memory Use & TempDB Impact
| Feature | Temp Table | Global Temp Table | Table Variable |
|---|---|---|---|
| TempDB Usage | MediumāHigh | MediumāHigh | LowāMedium |
| Memory Spills | Possible | Possible | Rare |
| Logging | Logged in tempdb | Logged in tempdb | Minimal |
Table variables consume fewer tempdb resourcesābut only because they donāt generate statistics or heavy metadata.
Error Handling & Transactions
Temp Tables
- Fully respect transactions
- Rollback reverts modifications
Global Temp Tables
- Same as temp tables
Table Variables
- Do not rollback fully
- Ideal for transactional isolation inside functions
Best Practices for Choosing the Right Temporary Structure
Use Temp Tables When:
- Handling large resultsets
- Needing statistics and indexes
- Doing multi-step operations
Use Global Temp Tables When:
- Sharing data across sessions
- Running server-wide processes
Use Table Variables When:
- Storing very small sets
- Inside functions or simple procedures
- Temporary row-level logic
Comparison Table: Summary
| Feature | Temp Table | Global Temp Table | Table Variable |
|---|---|---|---|
| Scope | Session | Server | Batch/Proc |
| Statistics | Full | Full | Limited |
| Indexing | Yes | Yes | Partial |
| Performance (small data) | Good | Good | Excellent |
| Performance (large data) | Excellent | Excellent | Poor |
| Concurrency Safety | High | Medium | High |
| Usage Difficulty | Easy | Medium | Easy |
Frequently Asked Questions
1. Are table variables stored in memory?
No. They are stored in tempdb, though they use less metadata.
2. Are temp tables faster than table variables?
Yes, especially for large datasets, due to full statistics.
3. Do table variables support indexing?
Yesābut only through inline declarations, not traditional CREATE INDEX.
4. When should I use global temp tables?
When multiple sessions require the same temporary data.
5. Can global temp tables cause conflicts?
Yes, if two processes attempt to create the same table name.
6. Do temp tables lock tempdb?
They can, especially under heavy load.
Conclusion: Choosing the Right Temporary Object
Understanding temp table vs global temp table vs temp variable helps you write faster, more efficient SQL. Temp tables provide the best optimizer support, global temp tables allow cross-session sharing, and table variables shine in small, lightweight tasks.
Pick the one that aligns with your query size, concurrency needs, and performance goals.
Discover more from Technology with Vivek Johari
Subscribe to get the latest posts sent to your email.


