此範例示範使用 In-Memory OLTP 時的效能改善,方法是比較對記憶體優化和傳統磁碟數據表執行相同 Transact-SQL 查詢時的回應時間差異。 此外,也會建立原生編譯預存程式(以相同的查詢為基礎),然後執行 以示範您在使用原生編譯預存程式查詢記憶體優化數據表時,通常會取得最佳響應時間。 此範例只會在存取記憶體優化數據表中的數據時,顯示效能改善的一個層面;執行插入時的數據存取效率。 此範例是單個線程,不會利用 In-Memory OLTP 的並行優點。 使用並行的工作負載將會看到更高的效能提升。
備註
另一個示範記憶體優化數據表的範例可在 SQL Server 2014 In-Memory OLTP 範例取得。
若要完成此範例,您將執行下列動作:
建立名為 imoltp 的資料庫,並改變其檔案詳細數據,以設定它以使用 In-Memory OLTP。
建立範例的資料庫物件:三個數據表和原生編譯預存程式。
執行不同的查詢,並顯示每個查詢的回應時間。
若要設定範例的 imoltp 資料庫,請先建立空的資料夾: c:\imoltp_data,然後執行下列程式代碼:
USE master
GO
-- Create a new database.
CREATE DATABASE imoltp
GO
-- Prepare the database for In-Memory OLTP by
-- adding a memory-optimized filegroup to the database.
ALTER DATABASE imoltp ADD FILEGROUP imoltp_file_group
CONTAINS MEMORY_OPTIMIZED_DATA;
-- Add a file (to hold the memory-optimized data) to the new filegroup.
ALTER DATABASE imoltp ADD FILE (name='imoltp_file', filename='c:\imoltp_data\imoltp_file')
TO FILEGROUP imoltp_file_group;
GO
接下來,執行下列程式代碼來建立磁碟數據表、兩個記憶體優化數據表,以及將用來示範不同數據存取方法的原生編譯預存程式:
USE imoltp
GO
-- If the tables or stored procedure already exist, drop them to start clean.
IF EXISTS (SELECT NAME FROM sys.objects WHERE NAME = 'DiskBasedTable')
DROP TABLE [dbo].[DiskBasedTable]
GO
IF EXISTS (SELECT NAME FROM sys.objects WHERE NAME = 'InMemTable')
DROP TABLE [dbo].[InMemTable]
GO
IF EXISTS (SELECT NAME FROM sys.objects WHERE NAME = 'InMemTable2')
DROP TABLE [dbo].[InMemTable2]
GO
IF EXISTS (SELECT NAME FROM sys.objects WHERE NAME = 'usp_InsertData')
DROP PROCEDURE [dbo].[usp_InsertData]
GO
-- Create a traditional disk-based table.
CREATE TABLE [dbo].[DiskBasedTable] (
c1 INT NOT NULL PRIMARY KEY,
c2 NCHAR(48) NOT NULL
)
GO
-- Create a memory-optimized table.
CREATE TABLE [dbo].[InMemTable] (
c1 INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT=1000000),
c2 NCHAR(48) NOT NULL
) WITH (MEMORY_OPTIMIZED=ON, DURABILITY = SCHEMA_AND_DATA);
GO
-- Create a 2nd memory-optimized table.
CREATE TABLE [dbo].[InMemTable2] (
c1 INT NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT=1000000),
c2 NCHAR(48) NOT NULL
) WITH (MEMORY_OPTIMIZED=ON, DURABILITY = SCHEMA_AND_DATA);
GO
-- Create a natively-compiled stored procedure.
CREATE PROCEDURE [dbo].[usp_InsertData]
@rowcount INT,
@c NCHAR(48)
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
AS
BEGIN ATOMIC
WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')
DECLARE @i INT = 1;
WHILE @i <= @rowcount
BEGIN
INSERT INTO [dbo].[inMemTable2](c1,c2) VALUES (@i, @c);
SET @i += 1;
END
END
GO
安裝程式已完成,且我們已準備好執行查詢,以顯示比較數據存取方法之間效能的回應時間。
若要完成此範例,請多次執行下列程序代碼。 忽略受到初始記憶體配置負面影響的第一次執行結果。
SET STATISTICS TIME OFF;
SET NOCOUNT ON;
-- Delete data from all tables to reset the example.
DELETE FROM [dbo].[DiskBasedTable]
WHERE [c1]>0
GO
DELETE FROM [dbo].[inMemTable]
WHERE [c1]>0
GO
DELETE FROM [dbo].[InMemTable2]
WHERE [c1]>0
GO
-- Declare parameters for the test queries.
DECLARE @i INT = 1;
DECLARE @rowcount INT = 100000;
DECLARE @c NCHAR(48) = N'12345678901234567890123456789012345678';
DECLARE @timems INT;
DECLARE @starttime datetime2 = sysdatetime();
-- Disk-based table queried with interpreted Transact-SQL.
BEGIN TRAN
WHILE @I <= @rowcount
BEGIN
INSERT INTO [dbo].[DiskBasedTable](c1,c2) VALUES (@i, @c);
SET @i += 1;
END
COMMIT
SET @timems = datediff(ms, @starttime, sysdatetime());
SELECT CAST(@timems AS VARCHAR(10)) + ' ms (disk-based table with interpreted Transact-SQL).';
-- Memory-optimized table queried with interpreted Transact-SQL.
SET @i = 1;
SET @starttime = sysdatetime();
BEGIN TRAN
WHILE @i <= @rowcount
BEGIN
INSERT INTO [dbo].[InMemTable](c1,c2) VALUES (@i, @c);
SET @i += 1;
END
COMMIT
SET @timems = datediff(ms, @starttime, sysdatetime());
SELECT CAST(@timems AS VARCHAR(10)) + ' ms (memory-optimized table with interpreted Transact-SQL).';
-- Memory-optimized table queried with a natively-compiled stored procedure.
SET @starttime = sysdatetime();
EXEC usp_InsertData @rowcount, @c;
SET @timems = datediff(ms, @starttime, sysdatetime());
SELECT CAST(@timems AS VARCHAR(10)) + ' ms (memory-optimized table with natively-compiled stored procedure).';
預期的結果會提供實際的回應時間,顯示使用記憶體優化數據表和原生編譯預存程式時,通常能比在傳統磁碟數據表上運行的相同工作負載提供更為一致且快速的回應時間。
另請參閱
AdventureWorks 的延伸模組以示範 In-Memory OLTP
In-Memory OLTP (記憶體中最佳化)
記憶體最佳化資料表
原生編譯的預存程序
使用記憶體最佳化資料表的需求
CREATE DATABASE (SQL Server Transact-SQL)
ALTER DATABASE 檔案及檔案群組選項 (Transact-SQL)
CREATE PROCEDURE 和 Memory-Optimized 數據表