Published on

December 5, 2015

Recompiling InMemory Objects in SQL Server

Recently, a reader asked me if it is possible to recompile InMemory objects in SQL Server. This question got me curious, so I decided to explore the possibility in SQL Server 2016. In this article, I will share the steps I took to recompile a Native InMemory stored procedure.

Step 1: Create a Database

First, we need to create a database with a filegroup for InMemory OLTP. Here is the code:

USE MASTER;
GO

IF DB_ID('InMem_OLTP') IS NOT NULL
BEGIN
    ALTER DATABASE [InMem_OLTP] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    DROP DATABASE [InMem_OLTP];
END

CREATE DATABASE [InMem_OLTP] ON PRIMARY
(
    NAME = N'InMem_OLTP_data',
    FILENAME = N'C:\DATA\InMem_OLTP_data.mdf',
    SIZE = 50MB
)
LOG ON
(
    NAME = N'InMem_OLTP_log',
    FILENAME = N'C:\DATA\InMem_OLTP_log.ldf',
    SIZE = 10MB
);
GO

USE InMem_OLTP;
GO

ALTER DATABASE InMem_OLTP ADD Filegroup [InMem_OLTP_InMemory] CONTAINS MEMORY_OPTIMIZED_DATA;
GO

ALTER DATABASE InMem_OLTP ADD FILE
(
    NAME = InMem_OLTP_InMemory,
    FILENAME = N'C:\Data\InMem_OLTP_mopt'
) TO FILEGROUP [InMem_OLTP_InMemory];

Step 2: Create an InMemory Table

Next, we need to create an InMemory table. Here is the code:

CREATE TABLE dbo.SalesOrder_inmem
(
    order_id INT IDENTITY NOT NULL,
    order_date DATETIME NOT NULL,
    order_status TINYINT NOT NULL,
    amount FLOAT NOT NULL,
    CONSTRAINT PK_SalesOrderID PRIMARY KEY NONCLUSTERED HASH (order_id) WITH (BUCKET_COUNT = 10000)
)
WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);
GO

Step 3: Create a Native Stored Procedure

Now, let’s create a Native stored procedure for our experiment. Here is the code:

USE InMem_OLTP;
GO

CREATE PROCEDURE [dbo].[InsertSalesOrder_Native]
    @order_status TINYINT = 1,
    @amount FLOAT = 100,
    @order_count INT = 100
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
AS
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = 'us_english')
    DECLARE @i INT = 0;

    WHILE @i < @order_count
    BEGIN
        INSERT INTO dbo.SalesOrder_inmem VALUES (GETDATE(), @order_status, @amount);
        SET @i = @i + 1;
    END
END
GO

Step 4: Recompile the Stored Procedure

Finally, let’s recompile the stored procedure using the sp_recompile system stored procedure. Here is the code:

EXEC sp_recompile 'InsertSalesOrder_Native';

The output for the above code should be: “Object ‘InsertSalesOrder_Native’ was successfully marked for recompilation.”

As you can see, we were able to successfully recompile the stored procedure without any problem. This experiment was conducted on a SQL Server 2016 environment. If you have ever needed this capability in your environment, I would love to know some of the use cases for it.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.