Aracılığıyla paylaş


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

Ş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.

OLTP'ye genel bakış In-Memory

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. Oluşturma zamanında bellek için iyileştirilmiş olması için bir tablo 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. Dayanıklı olmayan tablo, DAYANıKLıLıK=SCHEMA_ONLY ile bildirilen bellek için iyileştirilmiş bir tablodur ve bu tablolarda yapılan değişikliklerin GÇ'ye neden olmadığı anlamına gelir. Bu, dayanıklılığın önemli olmadığı durumlarda günlük GÇ kaynaklarının tüketilmesinden kaçınıyor.
  • Bellek için iyileştirilmiş tablo türleri , saklı 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 iyileştirilmiş bir tablo türü kullanılarak bildirilen tablo değişkenleri ve TVP'ler dayanıklı olmayan bellek için iyileştirilmiş tabloların avantajlarını devralır: verimli veri erişimi ve GÇ yok.
  • 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ı'nın 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 gönderimi işlevselliğ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.

Müşterilerin OLTP In-Memory başarılı olduğunu gördüğümüz senaryoların ve uygulama desenlerinin listesi aşağıdadır.

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

OlTP In-Memory oluşturduğumuz temel senaryo budur: tek tek işlemler için tutarlı düşük gecikme süresiyle büyük hacimli işlemleri destekler.

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ı yordamlara ne kadar çok mantık aktarabilirseniz, OLTP In-Memory o kadar fazla avantaj elde edebilirsiniz.

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:

  • Algılayıcı okumalarını ve olaylarını alma ve bildirimlerin yanı sıra geçmiş analizine izin verme.
  • 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 iyileştirilmiş bir tablo kullanın. Veri alımı çoğunlukla eklemelerden (güncelleştirmeler yerine) ve In-Memory OLTP depolama alanı ayak izinden oluşuyorsa,

  • Verileri kümelenmiş columnstore dizini olan bir disk tabanlı tabloya düzenli olarak toplu olarak boşaltmak için bir iş INSERT INTO <disk-based table> SELECT FROM <memory-optimized table>kullanın; veya
  • Geçmiş verileri yönetmek için zamansal bellek için iyileştirilmiş bir tablo kullanın. Bu modda geçmiş veriler diskte yer alır ve veri taşıma sistem tarafından yönetilir.

SQL Server örnek deposu, algılayıcı verilerinin In-Memory OLTP depolama alanı 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ş tablo türü ve yerel olarak derlenmiş bir saklı yordam kullanan bir akıllı kılavuz uygulaması içerir:

Önbelleğe alma 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

Blobu bir varbinary(max) sütununda depolayarak dayanıklı 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 nesnesi değiştirme

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 iyileştirilmiş tablo değişkenleri ve dayanıklı olmayan tablolar, geleneksel tablo değişkenleri ve #temp tabloyla karşılaştırıldığında genellikle CPU'ları azaltır ve günlük GÇ'sini tamamen kaldırır.

Uygulama ile ilgili hususlar

Başlamak için: Bellek iyileştirmeyi kullanarak geçici tablo ve tablo değişkeni performansını iyileştirme.

Müşteri örnek olay incelemesi

ETL (Dönüştürme Yükünü Ayıkla)

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ırlama için dayanıklı olmayan bellek için iyileştirilmiş tablolar kullanın. Tüm GÇ'yi tamamen kaldırır ve veri erişimini daha verimli hale 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 betik

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