Boost SQL Server Performance with Memory-Optimized Tables

What is a Memory-Optimized Table Variable?

A Memory-Optimized Table Variable is a special type of table variable that uses SQL Server's In-Memory OLTP engine. Unlike regular table variables or temporary tables (#temp), it is stored in memory, reducing tempdb contention and boosting performance for workloads with frequent data manipulation.

Why is it Useful?

Memory-Optimized Table Variables provide.

  • Faster performance: Avoids disk I/O by keeping data in memory.
  • Tempdb contention reduction: Traditional temp tables and table variables rely on tempdb, which can be a bottleneck.
  • Optimized latch-free concurrency: Uses memory-optimized data structures for ultra-fast access.
  • Efficient for short-lived data: Ideal for scenarios where data exists only within a session or batch.

When to Use It?

You should use Memory-Optimized Table Variables when,

  • Your queries experience tempdb contention.
  • You perform frequent batch operations with temporary data.
  • You need high-performance OLTP workloads with frequent inserts and lookups.
  • You are working with stored procedures that rely on table variables.

Where to Use It?

  • Stored procedures that process intermediate data.
  • ETL workloads require temporary staging tables.
  • High-performance transaction processing systems.
  • Session-based data caching to avoid repeated database calls.

How to Use a Memory-Optimized Table Variable?
 

1. Enable Memory-Optimized Tables in the Database

Before using memory-optimized table variables, you must enable In-Memory OLTP.

ALTER DATABASE YourDatabase
ADD FILEGROUP MemoryOptimizedFG CONTAINS MEMORY_OPTIMIZED_DATA;

ALTER DATABASE YourDatabase
ADD FILE (NAME = 'MemOptData', FILENAME = 'C:\Data\MemOptData')
TO FILEGROUP MemoryOptimizedFG;

2. Declare a Memory-Optimized Table Variable

Unlike a regular table variable, you must use MEMORY_OPTIMIZED = ON.

DECLARE @MemOptTable TABLE  
(  
    ID INT NOT NULL PRIMARY KEY NONCLUSTERED,  
    Name NVARCHAR(100) NOT NULL  
) WITH (MEMORY_OPTIMIZED = ON);

3. Insert and Query Data Efficiently

INSERT INTO @MemOptTable (ID, Name) VALUES (1, 'SQL Server'), (2, 'DBA Expert');

SELECT * FROM @MemOptTable;

4. Compare with Traditional Table Variables

A traditional table variable.

DECLARE @TableVar TABLE (ID INT, Name NVARCHAR(100));  
  • Uses tempdb, causing I/O overhead.
  • Suffers from locking and latching under high concurrency.

Memory-Optimized Table Variables

  • Avoid tempdb entirely.
  • Are lock-free and latch-free, making them 10x faster in some cases.

Real-Time Example: Improving Performance in a High-Traffic System

  • Scenario: A banking application processes thousands of real-time transactions per second. Using traditional table variables slows down the system due to tempdb contention.
  • Solution: By replacing standard table variables with Memory-Optimized Table Variables, the system eliminates tempdb bottlenecks, resulting in a 40% faster transaction processing time.
DECLARE @TransactionLog TABLE  
(  
    TransactionID INT NOT NULL PRIMARY KEY NONCLUSTERED,  
    AccountID INT NOT NULL,  
    Amount DECIMAL(10,2) NOT NULL  
) WITH (MEMORY_OPTIMIZED = ON);

Memory-optimized table Variables were introduced in SQL Server 2016 and are available in the following versions.

Compatible SQL Server Versions

  • SQL Server 2016 (13.x)
  • SQL Server 2017 (14.x)
  • SQL Server 2019 (15.x)
  • SQL Server 2022 (16.x)

Not Available In

SQL Server 2014 and earlier (Memory-optimized tables were introduced in 2014, but table variables were not supported as memory-optimized until 2016).

Best Practices & Recommendations

  • Enable In-Memory OLTP before using Memory-Optimized Table Variables.
  • Use them in stored procedures or batch processing scenarios for best performance.
  • Avoid using them for large datasets due to memory limitations.
  • Use Non-Clustered Indexes properly to avoid performance bottlenecks.
  • Test with different workloads before applying in production environments.

Up Next
    Ebook Download
    View all
    Learn
    View all