Aracılığıyla paylaş


Tanıtım: In-Memory OLTP'de Performans İyileştirmesi

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen Örneği

Bu konudaki kod örneği, bellek için iyileştirilmiş tabloların hızlı performansını gösterir. Bellek için iyileştirilmiş bir tablodaki verilere geleneksel, yorumlanmış Transact-SQL'den erişildiğinde performans artışı belirgindir. Bellek için iyileştirilmiş bir tablodaki verilere yerel olarak derlenmiş bir saklı yordamdan (NCSProc) erişildiğinde bu performans artışı daha da artar.

In-Memory OLTP'nin olası performans geliştirmelerinin daha kapsamlı bir tanıtımını görmek için bkz. OLTP Performans Tanıtımı v1.0In-Memory.

Bu makaledeki kod örneği tek iş parçacıklı olup In-Memory OLTP'nin eşzamanlılık avantajlarından yararlanmaz. Eşzamanlılık kullanan bir iş yükü daha yüksek bir performans kazancı görür. Kod örneği, performans geliştirmenin yalnızca bir yönünü gösterir; yani INSERT için veri erişimi verimliliği.

Bellek için iyileştirilmiş tablolar tarafından sunulan performans iyileştirmesi, bellek için iyileştirilmiş bir tablodaki verilere NCSProc'tan erişildiğinde tam olarak gerçekleştirilir.

Kod Örneği

Aşağıdaki alt bölümlerde her adım açıklanmaktadır.

Adım 1a: SQL Server Kullanılıyorsa Önkoşul

Bu ilk alt bölümdeki adımlar yalnızca SQL Server'da çalışıyorsanız ve Azure SQL Veritabanı'nda çalışıyorsanız geçerli değildir. Aşağıdakileri yapın:

  1. SQL Server'ınıza bağlanmak için SQL Server Management Studio 'yu (SSMS.exe) kullanın. Veya SSMS.exe benzer herhangi bir araç uygundur.

  2. C:\data\ adlı bir dizini el ile oluşturun. Örnek Transact-SQL kodu dizinin önceden var olmasını bekler.

  3. Veritabanını ve bellek için iyileştirilmiş dosya grubunu oluşturmak için kısa T-SQL'i çalıştırın.

go  
CREATE DATABASE imoltp;    --  Transact-SQL  
go  
  
ALTER DATABASE imoltp ADD FILEGROUP [imoltp_mod]  
    CONTAINS MEMORY_OPTIMIZED_DATA;  
  
ALTER DATABASE imoltp ADD FILE  
    (name = [imoltp_dir], filename= 'c:\data\imoltp_dir')  
    TO FILEGROUP imoltp_mod;  
go  
  
USE imoltp;  
go  

1b. Adım: Azure SQL Veritabanı Kullanılıyorsa Önkoşul

Bu alt bölüm yalnızca Azure SQL Veritabanı kullanıyorsanız geçerlidir. Aşağıdakileri yapın:

  1. Kod örneği için hangi mevcut test veritabanını kullanacağınıza karar verin.

  2. Yeni bir test veritabanı oluşturmaya karar verirseniz Azure portalını kullanarak imoltp adlı bir veritabanı oluşturun.

Bunun için Azure portalını kullanma yönergelerini istiyorsanız bkz. Azure SQL Veritabanı'nı Kullanmaya Başlama.

2. Adım: Memory-Optimized Tablolar ve NCSProc Oluşturma

Bu adım, bellek iyileştirmeli tablolar ve yerel olarak derlenmiş bir saklı yordam (NCSProc) oluşturur. Aşağıdakileri yapın:

  1. Yeni veritabanınıza bağlanmak için SSMS.exe kullanın.

  2. Veritabanınızda aşağıdaki T-SQL'i çalıştırın.

go  
DROP PROCEDURE IF EXISTS ncsp;  
DROP TABLE IF EXISTS sql;  
DROP TABLE IF EXISTS hash_i;  
DROP TABLE IF EXISTS hash_c;  
go  
  
CREATE TABLE [dbo].[sql] (  
  c1 INT NOT NULL PRIMARY KEY,  
  c2 NCHAR(48) NOT NULL  
);  
go  
  
CREATE TABLE [dbo].[hash_i] (  
  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 TABLE [dbo].[hash_c] (  
  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 PROCEDURE ncsp  
    @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].[hash_c] VALUES (@i, @c);  
    SET @i += 1;  
  END;  
END;  
go  

3. Adım: Kodu Çalıştırma

Artık bellek için iyileştirilmiş tabloların performansını gösterecek sorguları yürütebilirsiniz. Aşağıdakileri yapın:

  1. Veritabanınızda aşağıdaki T-SQL'i çalıştırmak için SSMS.exe kullanın.

    İlk çalıştırmada oluşan hız ve diğer performans verilerini görmezden gelin. İlk çalıştırma, ilk bellek ayırmaları gibi tek seferlik birkaç işlemin gerçekleştirilmesini sağlar.

  2. Veritabanınızda aşağıdaki T-SQL'i yeniden çalıştırmak için SSMS.exe kullanın.

go  
SET STATISTICS TIME OFF;  
SET NOCOUNT ON;  
  
-- Inserts, one at a time.  
  
DECLARE @starttime DATETIME2 = sysdatetime();  
DECLARE @timems INT;  
DECLARE @i INT = 1;  
DECLARE @rowcount INT = 100000;  
DECLARE @c NCHAR(48) = N'12345678901234567890123456789012345678';  
  
-- Harddrive-based table and interpreted Transact-SQL.  
  
BEGIN TRAN;  
  WHILE @i <= @rowcount  
  BEGIN;  
    INSERT INTO [dbo].[sql] VALUES (@i, @c);  
    SET @i += 1;  
  END;  
COMMIT;  
  
SET @timems = datediff(ms, @starttime, sysdatetime());  
SELECT 'A: Disk-based table and interpreted Transact-SQL: '  
    + cast(@timems AS VARCHAR(10)) + ' ms';  
  
-- Interop Hash.  
  
SET @i = 1;  
SET @starttime = sysdatetime();  
  
BEGIN TRAN;  
  WHILE @i <= @rowcount  
    BEGIN;  
      INSERT INTO [dbo].[hash_i] VALUES (@i, @c);  
      SET @i += 1;  
    END;  
COMMIT;  
  
SET @timems = datediff(ms, @starttime, sysdatetime());  
SELECT 'B: memory-optimized table with hash index and interpreted Transact-SQL: '  
    + cast(@timems as VARCHAR(10)) + ' ms';  
  
-- Compiled Hash.  
  
SET @starttime = sysdatetime();  
  
EXECUTE ncsp @rowcount, @c;  
  
SET @timems = datediff(ms, @starttime, sysdatetime());  
SELECT 'C: memory-optimized table with hash index and native SP:'  
    + cast(@timems as varchar(10)) + ' ms';  
go  
  
DELETE sql;  
DELETE hash_i;  
DELETE hash_c;  
go  

Sonraki adım, ikinci test çalıştırmamız tarafından oluşturulan çıkış zamanı istatistikleridir.

10453 ms , A: Disk-based table and interpreted Transact-SQL.  
5626 ms , B: memory-optimized table with hash index and interpreted Transact-SQL.  
3937 ms , C: memory-optimized table with hash index and native SP.  

Ayrıca Bkz.

In-Memory OLTP (In-Memory İyileştirme)