In-Memory OLTP'ye genel bakış ve kullanım senaryoları

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

In-Memory OLTP, SQL Server ve SQL Veritabanı'nda işlem işleme, veri alımı, veri yükü ve geçici veri senaryolarının performansını iyileştirmeye yönelik birinci teknolojidir. Bu makale teknolojiye genel bir bakış içerir ve In-Memory OLTP için kullanım senaryolarını özetler. In-Memory OLTP'nin uygulamanız için doğru olup olmadığını belirlemek için bu bilgileri kullanın. Makale In-Memory OLTP nesnelerini, performans tanıtımına başvuruyu ve sonraki adımlar için kullanabileceğiniz kaynaklara başvuruyu gösteren bir örnekle sona erer.

In-Memory OLTP’ye genel bakış

In-Memory OLTP, doğru iş yükleri için büyük performans kazanımları sağlayabilir. Müşteriler bazı durumlarda 30 kata kadar performans artışı görmüş olsa da, ne kadar kazanç göreceğiniz iş yüküne bağlıdır.

Şimdi, bu performans kazancı nereden geliyor? In-Memory OLTP, veri erişimini ve işlem yürütmeyi daha verimli hale getirerek ve eşzamanlı olarak yürütülen işlemler arasındaki kilit ve mandal çekişmelerini kaldırarak işlem işleme performansını artırır. In-Memory OLTP bellek içi olduğundan hızlı değildir; bellek içi verilerde iyileştirme nedeniyle hızlıdır. Bellek içi ve yüksek eşzamanlılık bilgi işlemindeki en son geliştirmelerden yararlanmak için veri depolama, erişim ve işleme algoritmaları sıfırdan yeniden tasarlandı.

Şimdi, verilerin bellek içinde olması, bir hata olduğunda veri kaybı anlamına gelmez. Varsayılan olarak, tüm işlemler tamamen dayanıklıdır, yani SQL Server'daki diğer tüm tablolarda elde ettiğiniz dayanıklılık garantilerine sahip olursunuz: işlem işlemenin bir parçası olarak, tüm değişiklikler diskteki işlem günlüğüne yazılır. İşlem işlendikten sonra herhangi bir zamanda bir hata olursa, veritabanı yeniden çevrimiçi olduğunda verileriniz orada olur. Ayrıca In-Memory OLTP kullanılabilirlik grupları, yük devretme kümesi örnekleri, yedekleme/geri yükleme gibi SQL Server'ın tüm yüksek kullanılabilirlik ve olağanüstü durum kurtarma özellikleriyle çalışır.

Veritabanınızda In-Memory OLTP kullanmak için aşağıdaki nesne türlerinden birini veya daha fazlasını kullanırsınız:

  • Bellek için iyileştirilmiş tablolar , kullanıcı verilerini depolamak için kullanılır. Bir tabloyu, oluşturulurken bellek için en iyi duruma getirilmiş olarak bildirirsiniz.
  • Dayanıklı olmayan tablolar , önbelleğe alma veya ara sonuç kümesi (geleneksel geçici tabloları değiştirme) için geçici veriler için kullanılır. Kalıcı olmayan tablo, DURABILITY=SCHEMA_ONLY olarak tanımlanan bellek için optimize edilmiş bir tablodur; yani bu tablolardaki değişiklikler herhangi bir G/Ç işlemine neden olmaz. Bu, kalıcılığın gerekli olmadığı durumlarda günlük giriş/çıkış kaynaklarının tüketilmesini önler.
  • Bellek için optimize edilmiş tablo türleri, depolanan yordamlarda tablo değerli parametreler (TVP'ler) ve ara sonuç kümeleri için kullanılır. Bellek için iyileştirilmiş tablo türleri, geleneksel tablo türleri yerine kullanılabilir. Bellek için optimize edilmiş bir tablo türü kullanılarak bildirilen tablo değişkenleri ve TVP'ler, kalıcı olmayan bellek için optimize edilmiş tabloların avantajlarından yararlanır: verimli veri erişimi ve G/Ç gerektirmeme.
  • Yerel olarak derlenmiş T-SQL modülleri , işlemleri işlemek için gereken CPU döngülerini azaltarak tek bir işlem için geçen süreyi daha da azaltmak için kullanılır. Oluşturma zamanında yerel olarak derlenecek bir Transact-SQL modülü bildirirsiniz. Şu anda, aşağıdaki T-SQL modülleri yerel olarak derlenebilir: saklı yordamlar, tetikleyiciler ve skaler kullanıcı tanımlı işlevler.

In-Memory OLTP, SQL Server ve SQL Veritabanı'nda yerleşik olarak bulunur. Bu nesneler geleneksel karşılıklarına benzer şekilde davrandığından, veritabanında ve uygulamada yalnızca en az değişiklik yaparken genellikle performans avantajları elde edebilirsiniz. Ayrıca, aynı veritabanında hem bellek için iyileştirilmiş hem de geleneksel disk tabanlı tablolara sahip olabilir ve ikisinde de sorgu çalıştırabilirsiniz. Bu makalenin devamında bu tür nesnelerin her biri için örnek Transact-SQL betiğine bakın.

In-Memory OLTP için kullanım senaryoları

In-Memory OLTP sihirli hızlı bir düğme değildir ve tüm iş yükleri için uygun değildir. Örneğin, sorguların çoğu büyük veri aralıkları üzerinde toplama gerçekleştiriyorsa bellek için iyileştirilmiş tablolar CPU kullanımınızı azaltmaz. Columnstore dizinleri bu senaryoya yardımcı olur.

Dikkat

Bilinen sorun: Bellek için iyileştirilmiş tablolara sahip veritabanları için, kurtarma olmadan işlem günlüğü yedeklemesi gerçekleştirmek ve daha sonra kurtarma ile işlem günlüğü geri yüklemesini yürütmek yanıt vermeyen bir veritabanı geri yükleme işlemine neden olabilir. Bu sorun, günlük aktarma özelliğini de etkileyebilir. Bu sorunu geçici olarak çözmek için, geri yükleme işlemi başlatılmadan önce SQL Server örneği yeniden başlatılabilir.

Aşağıda, müşterilerin In-Memory OLTP ile başarılı olduğunu gördüğümüz senaryoların ve uygulama düzenlerinin bir listesi yer almaktadır.

Yüksek aktarım hızı ve düşük gecikme süreli işlem işleme

In-Memory OLTP’yi geliştirdiğimiz temel senaryo budur: tekil işlemler için tutarlı biçimde düşük gecikme süreleri sağlayarak yüksek hacimli işlemleri desteklemek.

Yaygın iş yükü senaryoları şunlardır: finansal araçların ticareti, spor bahisleri, mobil oyun ve reklam dağıtımı. Sık okunan ve/veya güncelleştirilen bir diğer yaygın desen de "katalog"dur. Örneklerden biri, her biri birden çok küme düğümüne dağıtılmış büyük dosyalarınız olduğu ve bellek için iyileştirilmiş bir tablodaki her dosyanın her bir parçasının konumunu katalogladığınız yerdir.

Uygulama ile ilgili hususlar

Çekirdek işlem tablolarınız için bellek için iyileştirilmiş tablolar, yani performans açısından en kritik işlemlere sahip tablolar kullanın. İş işlemiyle ilişkili mantığın yürütülmesini iyileştirmek için yerel olarak derlenmiş saklı yordamları kullanın. Veritabanındaki saklı yordamların içine ne kadar çok mantık aktarabilirseniz, In-Memory OLTP’den o kadar fazla fayda sağlarsınız.

Mevcut bir uygulamaya başlamak için:

  1. Geçirmek istediğiniz nesneleri tanımlamak için işlem performansı analizi raporunu kullanın.
  2. Geçişe yardımcı olması için Bellek İyileştirme Danışmanı'nı ve Yerel Derleme Danışmanı'nı kullanın.

IoT (Nesnelerin İnterneti) dahil olmak üzere veri alımı

In-Memory OLTP, aynı anda birçok farklı kaynaktan büyük hacimli verileri alma konusunda iyidir. Sql Server, verilerle ilgili sorguları hızlı bir şekilde çalıştırdığından ve gerçek zamanlı içgörüler elde etmenizi sağladığından, verileri diğer hedeflerle karşılaştırıldığında SQL Server veritabanına almak genellikle yararlıdır.

Yaygın uygulama desenleri şunlardır:

  • Sensör verilerini ve olaylarını alma, bildirimlere olanak tanıma ve geçmişe dönük analiz sağlama.
  • Birden çok kaynaktan bile toplu güncelleştirmeleri yönetirken eşzamanlı okuma iş yükü üzerindeki etkiyi en aza indirir.

Uygulama ile ilgili hususlar

Veri alımı için bellek için optimize edilmiş bir tablo kullanın. Veri alma işlemi çoğunlukla eklemelerden (güncelleştirmeler yerine) oluşuyorsa ve verilerin In-Memory OLTP depolama ayak izi endişe yaratıyorsa, ya da

SQL Server örnekler deposu, algılayıcı verilerinin In-Memory OLTP depolama ayak izini yönetirken veri alımını hızlandırmak için zamansal, bellek için iyileştirilmiş bir tablo, bellek için iyileştirilmiş bir tablo türü ve yerel olarak derlenmiş bir saklı yordam kullanan bir akıllı şebeke uygulaması içerir:

Önbellekleme ve oturum durumu

In-Memory OLTP teknolojisi, SQL Server veya Azure SQL veritabanlarındaki veritabanı altyapısını oturum durumunu korumak (örneğin, ASP.NET bir uygulama için) ve önbelleğe almak için cazip bir platform haline getirir.

ASP.NET oturum durumu, In-Memory OLTP için başarılı bir kullanım örneğidir. SQL Server ile bir müşteri saniyede 1,2 Milyon istek elde etmek üzereydi. Bu arada kuruluştaki tüm orta katman uygulamalarının önbelleğe alma gereksinimleri için In-Memory OLTP kullanmaya başladılar. Ayrıntılar: Bwin' in daha önce görülmemiş bir performans ve ölçek elde etmek için OLTP In-Memory SQL Server 2016 (13.x) kullanma şekli

Uygulama ile ilgili hususlar

BLOB’u bir varbinary(max) sütununda depolayarak, kalıcı olmayan, bellek için iyileştirilmiş tabloları basit bir anahtar-değer deposu olarak kullanabilirsiniz. Alternatif olarak, SQL Server ve SQL Veritabanı'nda JSON desteğiyle yarı yapılandırılmış bir önbellek uygulayabilirsiniz. Son olarak, çeşitli veri türleri ve kısıtlamalar da dahil olmak üzere tam ilişkisel şemaya sahip dayanıklı olmayan tablolar aracılığıyla tam ilişkisel önbellek oluşturabilirsiniz.

Yerleşik SQL Server oturum durumu sağlayıcısı tarafından oluşturulan nesneleri değiştirmek için GitHub'da yayımlanan betikleri kullanarak ASP.NET oturum durumunu bellek iyileştirmeye başlayın: aspnet-session-state

Müşteri örnek olay incelemesi

tempdb nesnesinin değiştirilmesi

Geçici tablolar, tablo değişkenleri ve tablo değerli parametreler (TVP' ler) gibi geleneksel tempdb tabanlı yapılarınızı değiştirmek için dayanıklı olmayan tablolar ve bellek için iyileştirilmiş tablo türleri kullanın.

Bellek için optimize edilmiş tablo değişkenleri ve kalıcı olmayan tablolar, geleneksel tablo değişkenleri ve #temp tablolarla karşılaştırıldığında genellikle CPU kullanımını azaltır ve işlem günlüğü G/Ç'sini tamamen ortadan kaldırır.

Uygulama ile ilgili hususlar

Başlamak için: Geçici tablo ve tablo değişken performansını bellek optimizasyonu kullanarak iyileştirmek.

Müşteri örnek olay incelemesi

ETL (Çıkar, Dönüştür, Yükle)

ETL iş akışları genellikle hazırlama tablosuna veri yükünü, verilerin dönüşümlerini ve son tablolara yüklemeyi içerir.

Veri hazırlamada dayanıklı olmayan, bellek için optimize edilmiş tablolar kullanın. Tüm G/Ç'yi ortadan kaldırır ve veri erişimini daha verimli hâle getirir.

Uygulama ile ilgili hususlar

Hazırlama tablosunda iş akışının bir parçası olarak dönüştürmeler gerçekleştirirseniz, bu dönüştürmeleri hızlandırmak için yerel olarak derlenmiş saklı yordamları kullanabilirsiniz. Bu dönüştürmeleri paralel olarak gerçekleştirebiliyorsanız bellek iyileştirmesinden ek ölçeklendirme avantajları elde edersiniz.

Örnek komut dosyası

In-Memory OLTP kullanmaya başlamadan önce bir MEMORY_OPTIMIZED_DATA dosya grubu oluşturmanız gerekir. Buna ek olarak, veritabanı uyumluluk düzeyi 130 (veya üzeri) kullanmanızı ve MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT veritabanı seçeneğini ON olarak ayarlamanızı öneririz.

Varsayılan veri klasöründe dosya grubunu oluşturmak ve önerilen ayarları yapılandırmak için aşağıdaki konumdaki betiği kullanabilirsiniz:

Aşağıdaki örnek betik, veritabanınızda oluşturabileceğiniz In-Memory OLTP nesnelerini gösterir.

İlk olarak veritabanını In-Memory OLTP için yapılandırarak başlayın.

-- configure recommended DB option
ALTER DATABASE CURRENT SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=ON;
GO

Farklı dayanıklılığa sahip tablolar oluşturabilirsiniz:

-- memory-optimized table
CREATE TABLE dbo.table1
( c1 INT IDENTITY PRIMARY KEY NONCLUSTERED,
  c2 NVARCHAR(MAX))
WITH (MEMORY_OPTIMIZED=ON);
GO
-- non-durable table
CREATE TABLE dbo.temp_table1
( c1 INT IDENTITY PRIMARY KEY NONCLUSTERED,
  c2 NVARCHAR(MAX))
WITH (MEMORY_OPTIMIZED=ON,
      DURABILITY=SCHEMA_ONLY);
GO

Bellek içi tablo olarak bir tablo türü oluşturabilirsiniz.

-- memory-optimized table type
CREATE TYPE dbo.tt_table1 AS TABLE
( c1 INT IDENTITY,
  c2 NVARCHAR(MAX),
  is_transient BIT NOT NULL DEFAULT (0),
  INDEX ix_c1 HASH (c1) WITH (BUCKET_COUNT=1024))
WITH (MEMORY_OPTIMIZED=ON);
GO

Yerel olarak derlenmiş bir saklı yordam oluşturabilirsiniz. Daha fazla bilgi için bkz. Veri Erişim Uygulamalarından Yerel Olarak Derlenmiş Saklı Yordamları Çağırma.

-- natively compiled stored procedure
CREATE PROCEDURE dbo.usp_ingest_table1
  @table1 dbo.tt_table1 READONLY
WITH NATIVE_COMPILATION, SCHEMABINDING
AS
BEGIN ATOMIC
    WITH (TRANSACTION ISOLATION LEVEL=SNAPSHOT,
          LANGUAGE=N'us_english')

  DECLARE @i INT = 1

  WHILE @i > 0
  BEGIN
    INSERT dbo.table1
    SELECT c2
    FROM @table1
    WHERE c1 = @i AND is_transient=0

    IF @@ROWCOUNT > 0
      SET @i += 1
    ELSE
    BEGIN
      INSERT dbo.temp_table1
      SELECT c2
      FROM @table1
      WHERE c1 = @i AND is_transient=1

      IF @@ROWCOUNT > 0
        SET @i += 1
      ELSE
        SET @i = 0
    END
  END

END
GO
-- sample execution of the proc
DECLARE @table1 dbo.tt_table1;
INSERT @table1 (c2, is_transient) VALUES (N'sample durable', 0);
INSERT @table1 (c2, is_transient) VALUES (N'sample non-durable', 1);
EXECUTE dbo.usp_ingest_table1 @table1=@table1;
SELECT c1, c2 from dbo.table1;
SELECT c1, c2 from dbo.temp_table1;
GO