Aracılığıyla paylaş


In-Memory OLTP'deki başlangıç alanları üzerine bir inceleme

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

Bu makale, Microsoft SQL Server ve Azure SQL Veritabanı'nın In-Memory OLTP performans özelliklerinin temellerini öğrenmek için acelesi olan geliştiriciye yöneliktir.

In-Memory OLTP için bu makalede aşağıdakiler sağlanır:

  • Özelliklerin hızlı açıklamaları.
  • Özellikleri uygulayan çekirdek kod örnekleri.

SQL Server ve SQL Veritabanı, In-Memory teknolojileri desteğinde yalnızca küçük varyasyonlara sahiptir.

Vahşi ortamda bazı bloggerlar In-Memory OLTP'den Hekatonolarak bahseder.

In-Memory Özelliklerinin Avantajları

SQL Server, birçok uygulama sisteminin performansını büyük ölçüde geliştirebilecek In-Memory özellikler sağlar. En basit hususlar bu bölümde açıklanmıştır.

OLTP özellikleri (Çevrimiçi İşlem İşleme)

Çok sayıda SQL INSERT'yi eşzamanlı olarak işlemesi gereken sistemler OLTP özellikleri için mükemmel adaylardır.

  • Karşılaştırmalarımız, In-Memory özelliklerin benimsenmesiyle 5 kat ile 20 kat daha hızlı hız iyileştirmelerinin elde edilebilir olduğunu gösteriyor.

Ağır hesaplamaları işleyen sistemler Transact-SQL'da uygun adaylardır.

  • Ağır hesaplamalara ayrılmış bir saklı yordam 99 kat daha hızlı çalışabilir.

Daha sonra In-Memory OLTP'den performans kazanımlarının tanıtımlarını sunan aşağıdaki makaleleri ziyaret edebilirsiniz:

  • Gösterimi: In-Memory OLTP Performans İyileştirmesi, daha büyük potansiyel performans kazanımlarının küçük ölçekli bir gösterimini sunar.
  • In-Memory OLTP için Örnek Veritabanı daha büyük bir ölçek gösterimi sunar.

operasyonel analiz özellikleri

In-Memory Analytics, genellikle GROUP BY yan tümcesi dahil ederek işlem verilerini toplayan SQL SELECT'lerini ifade eder. columnstore olarak adlandırılan dizin türü, operasyonel analiz için merkezidir.

İki ana senaryo vardır:

  • Batch Operasyonel Analiz, mesai saatleri dışında veya işlem verilerinin kopyalarını içeren ikincil donanımda çalışan toplama işlemlerini anlatır.
  • Gerçek Zamanlı Operasyonel Analiz, iş saatleri sırasında ve işlem yükleri üzerinde kullanılan birincil donanımda çalışan toplama süreçlerini ifade eder.

Bu makalede Analiz'e değil OLTP'ye odaklanmaktadır. Columnstore dizinlerinin Analytics'i SQL'e nasıl getirdiği hakkında bilgi için bkz:

Columnstore

Mükemmel blog gönderilerinden oluşan bir dizi, columnstore dizinlerini çeşitli açılardan zarif bir şekilde açıklar. Gönderilerin çoğunluğu, columnstore tarafından desteklenen gerçek zamanlı operasyonel analiz kavramını daha ayrıntılı olarak açıklar. Bu gönderiler, Mart 2016'da Microsoft Program Yöneticisi Sunil Agarwal tarafından yazılmıştır.

Gerçek zamanlı Operasyonel Analiz

  1. In-Memory Teknolojisini Kullanarak operasyonel analiz Real-Time
  2. Real-Time Operasyonel Analiz - Genel bakış kümesiz sütun deposu dizini (NCCI)
  3. Real-Time Operasyonel Analiz: SQL Server 2016'de kümelenmemiş kümelenmiş columnstore dizininin (NCCI) kullanıldığı basit örnek
  4. Real-Time Operasyonel Analiz: SQL Server 2016'da DML işlemleri ve kümelenmemiş columnstore dizini (NCCI)
  5. Real-Time Operasyonel Analitik: Filtrelenmiş kümelenmemiş sütun deposu dizini (NCCI)
  6. Real-Time Operasyonel Analiz: Kümelenmemiş sütun deposu dizini (NCCI) için Sıkıştırma Gecikme Seçeneği
  7. Real-Time Operasyonel Analiz: NCCI ile Sıkıştırma Gecikmesi seçeneği ve performans
  8. Real-Time Operasyonel Analiz: Memory-Optimized Tablolar ve sütun deposu dizini

Columnstore dizinini yeniden düzenleme

  1. REORGANIZE Komutunu Kullanarak Columnstore Dizin Defragmentasyonu
  2. REORGANIZE için Columnstore dizini Birleştirme İlkesini

Verilerin toplu içeri aktarılması

  1. Kümeli Sütun Deposu: Toplu Yükleme
  2. Kümelenmiş sütun deposu dizini: Veri Yükleme Optimizasyonları - Minimum Günlük Kaydı
  3. kümelenmiş columnstore dizinini : Veri Yükü İyileştirme - Paralel Toplu İçeri Aktarma

In-Memory OLTP özellikleri

In-Memory OLTP'nin ana özelliklerine göz atalım.

Bellek için iyileştirilmiş tablolar

CREATE TABLE deyiminde T-SQL anahtar sözcüğü MEMORY_OPTIMIZED, bir tablonun disk yerine etkin bellekte var olması için nasıl oluşturulduğudur.

Bellek için iyileştirilmiş tablolar, etkin bellekte kendisinin bir gösterimine ve diskteki ikincil kopyaya sahiptir.

  • Disk kopyası, sunucunun veya veritabanının kapatıldıktan sonra yeniden başlatılmasından sonra rutin kurtarma içindir. Bu bellek artı disk çiftliği sizden ve kodunuzdan tamamen gizlenir.

Yerel olarak derlenmiş modüller

CREATE PROCEDURE deyimindeki T-SQL anahtar sözcüğü NATIVE_COMPILATION, yerel olarak derlenmiş bir saklı yordam oluşturmak için kullanılır. T-SQL deyimleri, veritabanı her çevrimiçi hale getirildiğinde yerel prosedürün ilk kullanımında makine koduna derlenir. T-SQL yönergeleri artık her bir yönergenin yavaş yorumlanmasına katlanmaz.

  • Yerel derlemenin, yorumlanan sürenin 1/100'ünde olan sürelerle sonuçlandığını gördük.

Yerel modül yalnızca bellek için iyileştirilmiş tablolara başvurabilir ve disk tabanlı tablolara başvuramaz.

Yerel olarak derlenmiş üç tür modül vardır:

Azure SQL Veritabanı'nda kullanılabilirlik

In-Memory OLTP ve Columnstore, Azure SQL Veritabanı'nda kullanılabilir. Ayrıntılar için, SQL Veritabanı ’de In-Memory Teknolojilerini kullanarak Performansı İyileştirmebölümüne bakın.

1. Uyumluluk düzeyinin >= 130 olduğundan emin olun

Bu bölüm, In-Memory OLTP özelliklerini uygulamak için kullanabileceğiniz Transact-SQL söz dizimini gösteren numaralandırılmış bölümler dizisine başlar.

İlk olarak, veritabanınızın en az 130 uyumluluk düzeyine ayarlanması önemlidir. Ardından, geçerli veritabanınızın ayarlandığı geçerli uyumluluk düzeyini görüntülemek için T-SQL kodu yer alır.

SELECT d.compatibility_level
    FROM sys.databases as d
    WHERE d.name = Db_Name();

Ardından, gerekirse düzeyi güncelleştirmek için T-SQL kodu yer alır.

ALTER DATABASE CURRENT
    SET COMPATIBILITY_LEVEL = 130;

2. SNAPSHOT sürümüne yükseltin

Bir işlem hem disk tabanlı bir tablo hem de bellek için iyileştirilmiş bir tablo içerdiğinde, kapsayıcılar arası işlemiolarak adlandırıyoruz. Böyle bir işlemde, işlemin bellek için iyileştirilmiş bölümünün SNAPSHOT adlı işlem yalıtım düzeyinde çalışması önemlidir.

Kapsayıcılar arası bir işlemde bellek için iyileştirilmiş tablolar için bu düzeyi güvenilir bir şekilde uygulamak aşağıdaki T-SQL'i yürüterek veritabanı ayarınızı değiştirin.

ALTER DATABASE CURRENT
    SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;

3. İyileştirilmiş bir FILEGROUP oluşturma

Microsoft SQL Server'da, bellek için iyileştirilmiş bir tablo oluşturabilmeniz için önce CONTAINS MEMORY_OPTIMIZED_DATA bildirdiğiniz bir FILEGROUP oluşturmanız gerekir. FILEGROUP veritabanınıza atanır. Ayrıntılar için bkz:

Azure SQL Veritabanı'nda böyle bir FILEGROUP oluşturmanız gerekmez ve oluşturamazsınız.

Aşağıdaki örnek T-SQL betiği, In-Memory OLTP için bir veritabanı etkinleştirir ve önerilen tüm ayarları yapılandırılır. Hem SQL Server hem de Azure SQL Veritabanı ile çalışır: enable-in-memory-oltp.sql.

MEMORY_OPTIMIZED_DATA dosya grubuna sahip veritabanları için tüm SQL Server özelliklerinin desteklenmediğini unutmayın. Sınırlamalarla ilgili ayrıntılar için bkz. OLTP In-Memory için Desteklenmeyen SQL Server Özellikleri

4. Bellek için iyileştirilmiş bir tablo oluşturma

Kritik Transact-SQL anahtar sözcüğü MEMORY_OPTIMIZED.

CREATE TABLE dbo.SalesOrder
    (
        SalesOrderId   integer   not null   IDENTITY
            PRIMARY KEY NONCLUSTERED,
        CustomerId   integer    not null,
        OrderDate    datetime   not null
    )
        WITH
            (MEMORY_OPTIMIZED = ON,
            DURABILITY = SCHEMA_AND_DATA);

Transact-SQL INSERT ve SELECT ifadeleri, bellek için iyileştirilmiş bir tabloya karşı, normal bir tabloda olduğu gibidir.

ALTER TABLE komutu Memory-Optimized tablolar için

ALTER TABLE... ADD/DROP, bellek için iyileştirilmiş bir tabloya veya dizine sütun ekleyebilir veya kaldırabilir.

  • CREATE INDEX ve DROP INDEX bellek iyileştirmeli bir tabloda çalıştırılamaz, bunun yerine ALTER TABLE ... ADD/DROP INDEX kullanın.
  • Ayrıntılar için bkz. Memory-Optimized Tabloları Değiştirme.

Bellek için iyileştirilmiş tablolarınızı ve dizinlerinizi planlama

5. Yerel olarak derlenmiş bir saklı yordam (yerel proc) oluşturma

Kritik anahtar sözcük NATIVE_COMPILATION.

CREATE PROCEDURE ncspRetrieveLatestSalesOrderIdForCustomerId  
        @_CustomerId   INT  
        WITH  
            NATIVE_COMPILATION,  
            SCHEMABINDING  
    AS  
    BEGIN ATOMIC  
        WITH  
            (TRANSACTION ISOLATION LEVEL = SNAPSHOT,
            LANGUAGE = N'us_english')  
      
        DECLARE @SalesOrderId int, @OrderDate datetime;
      
        SELECT TOP 1  
                @SalesOrderId = s.SalesOrderId,  
                @OrderDate    = s.OrderDate  
            FROM dbo.SalesOrder AS s  
            WHERE s.CustomerId = @_CustomerId  
            ORDER BY s.OrderDate DESC;  
      
        RETURN @SalesOrderId;  
    END;  

SCHEMABINDING anahtar sözcüğü, önce yerel proc bırakılmadığı sürece yerel proc'da başvurulan tabloların bırakılamayacağı anlamına gelir. Ayrıntılar için bkz. Yerel Olarak Derlenmiş Saklı Yordamlar Oluşturma.

Bellek için optimize edilmiş bir tabloya erişmek için yerel olarak derlenmiş bir saklı yordam oluşturmanız gerekmediğini unutmayın. Ayrıca geleneksel saklı yordamlardan ve özel amaçlı toplu işlemlerden bellek için iyileştirilmiş tablolara erişebilirsiniz.

6. Yerel işlemi yürüt

Tabloyu iki veri satırıyla doldurun.

INSERT into dbo.SalesOrder  
        ( CustomerId, OrderDate )  
    VALUES  
        ( 42, '2013-01-13 03:35:59' ),
        ( 42, '2015-01-15 15:35:59' );

Yerel olarak derlenmiş saklı yordama bir EXECUTE çağrısı yapılır.

DECLARE @LatestSalesOrderId int, @mesg nvarchar(128);
      
EXECUTE @LatestSalesOrderId =  
    ncspRetrieveLatestSalesOrderIdForCustomerId 42;
      
SET @mesg = CONCAT(@LatestSalesOrderId,  
    ' = Latest SalesOrderId, for CustomerId = ', 42);
PRINT @mesg;  

Gerçek PRINT çıktısı aşağıdadır:

-- 2 = Latest SalesOrderId, for CustomerId = 42  

Belgelere ve sonraki adımlara yönelik kılavuz

Yukarıdaki düz örnekler, In-Memory OLTP'nin daha gelişmiş özelliklerini öğrenmenize yönelik bir temel sunar. Aşağıdaki bölümler, bilmeniz gerekebilecek özel noktalara ve her birinin ayrıntılarını görebileceğiniz noktalara yönelik bir kılavuzdur.

In-Memory OLTP özellikleri çok daha hızlı nasıl çalışır?

Aşağıdaki alt bölümlerde, In-Memory OLTP özelliklerinin gelişmiş performans sağlamak için dahili olarak nasıl çalıştığı kısaca açıklanmaktadır.

Bellek için iyileştirilmiş tablolar nasıl daha hızlı performans gösterir?

İkili yapı: Bellek için iyileştirilmiş bir tablonun çift yapısı vardır: biri etkin bellekte, diğeri sabit diskte. Her işlem, tablonun her iki gösterimine de uygulanır. İşlemler çok daha hızlı etkin bellek gösterimine karşı çalışır. Bellek için iyileştirilmiş tablolar, etkin belleğin diske kıyasla daha yüksek hızından yararlanan tablolardır. Ayrıca, etkin belleğin daha fazla çevikliği, hız için optimize edilmiş daha gelişmiş bir tablo yapısının kullanılmasını pratik hale getirir. Gelişmiş yapı aynı zamanda sayfasız olduğundan, mandallar ve dönme kilitleriyle ilgili ek yük ve çekişmeleri önler.

Kilit yok: Bellek için iyileştirilmiş tablo, eşzamanlılık ve yüksek aktarım hızı yerine veri bütünlüğünün rakip hedeflerine yönelik iyimser yaklaşıma dayanır. İşlem sırasında tablo, güncelleştirilmiş veri satırlarının herhangi bir sürümüne kilit yerleştirmez. Bu, bazı yüksek hacimli sistemlerde çekişmeleri büyük ölçüde azaltabilir.

Satır sürümleri: Bellek için iyileştirilmiş tablo, güncelleştirilmiş bir satırın yeni bir sürümünü tempdb'de değil, tablonun kendisinde kilitler yerine ekler. Özgün satır, işlem işleninceye kadar tutulur. İşlem sırasında, diğer işlemler satırın özgün sürümünü okuyabilir.

  • Disk tabanlı bir tablo için bir satırın birden çok sürümü oluşturulduğunda, satır sürümleri geçici olarak tempdb'de depolanır.

Daha az günlüğe kaydetme: Güncelleştirilmiş satırların önceki ve sonraki sürümleri bellek için optimize edilmiş tabloda saklanır. Satır çifti, günlük dosyasına geleneksel olarak yazılan bilgilerin çoğunu sağlar. Bu, sistemin günlüğe daha az ve daha az sıklıkta bilgi yazmasına olanak tanır. Ancak işlem bütünlüğü sağlanır.

Yerel procs nasıl daha hızlı performans gösterir?

Normal yorumlanmış saklı yordamı yerel olarak derlenmiş bir saklı yordama dönüştürmek, çalışma zamanında yürütülecek yönergelerin sayısını büyük ölçüde azaltır.

In-Memory özelliklerinin ödünleri

Bilgisayar biliminde yaygın olduğu gibi, In-Memory özelliklerinin sağladığı performans kazanımları bir ödünleşimdir. Daha iyi özellikler, özelliğin ek maliyetlerinden daha değerli avantajlar getirir. Dengeler hakkında kapsamlı yönergelere şu konumdan ulaşabilirsiniz:

  • SQL Server'da In-Memory OLTP Özelliklerini benimsemenizi planlama

Bu bölümün geri kalanında bazı önemli planlama ve takas konuları listeleniyor.

Bellek için optimize edilmiş tabloların ödünleri

Bellek tahmini: Bellek için iyileştirilmiş tablonuzun kullanacağı etkin bellek miktarını tahmin etmeniz gerekir. Bilgisayar sisteminizin bellek için iyileştirilmiş bir tabloyu barındırmak için yeterli bellek kapasitesine sahip olması gerekir. Ayrıntılar için bkz:

Büyük tablonuzu bölümleme: Çok fazla etkin bellek talebini karşılamanın bir yolu, büyük tablonuzu en son son veri satırlarını depolayan bellek içi parçalara bölmek ve diskteki soğuk eski satırlarını depolayan diğer bölümlere (tamamen sevk edilmiş ve tamamlanmış satış siparişleri gibi) bölmektir. Bu bölümleme, el ile gerçekleştirilen bir tasarım ve uygulama işlemidir. Bkz.

Yerel süreçlerin ödünleşimleri

  • Yerel olarak derlenmiş saklı yordam, disk tabanlı bir tabloya erişemez. Yerel bir proc yalnızca bellek için iyileştirilmiş tablolara erişebilir.
  • Bir yerel proc, sunucu veya veritabanı en son yeniden çevrimiçi olduktan sonra ilk kez çalıştırıldığında, yerel proc bir kez yeniden derlenmelidir. Bu, yerel proc çalışmaya başlamadan önce bir gecikmeye neden olur.

Bellek açısından optimize edilmiş tablolar için ileri düzey hususlar

Memory-Optimized Tablo için Dizinleri, geleneksel disk içi tablolardaki dizinlerden bazı açılardan farklıdır. Karma Dizinler yalnızca bellek için optimize edilmiş tablolarda kullanılabilir.

Bellek için optimize edilmiş tablonuz ve dizinleri için yeterli etkin bellek olduğundan emin olmak amacıyla plan yapmalısınız. Bakınız:

  • Memory-Optimized Nesneler için Depolama Oluşturma ve Yönetme

Bellek için optimize edilmiş bir tablo, DAYANIKLILIK = SCHEMA_ONLY olarak bildirilebilir.

  • Bu sözdizimi, veritabanı çevrimdışına alındığında sisteme bellek için optimize edilmiş tablodaki tüm verileri atması gerektiğini bildirir. Yalnızca tablo tanımı kalıcıdır.
  • Veritabanı yeniden çevrimiçi duruma getirildiğinde, bellek için iyileştirilmiş tablo etkin belleğe geri yüklenir ve veriler boş olur.
  • SCHEMA_ONLY tablolar, birçok binlerce satırın işleme dahil edildiği tempdb'de #temporary tablolara üstün bir alternatif olabilir.

Tablo değişkenleri bellek için iyileştirilmiş olarak da bildirilebilir. Bkz:

Yerel olarak derlenmiş modüller için ileri seviyede hususlar

Transact-SQL aracılığıyla kullanılabilen yerel olarak derlenmiş modül türleri şunlardır:

Yerel olarak derlenmiş kullanıcı tanımlı işlev (UDF), yorumlanan bir UDF'den daha hızlı çalışır. UDF'lerde göz önünde bulundurmanız gereken bazı şeyler şunlardır:

  • T-SQL SELECT bir UDF kullandığında, döndürülen satır başına her zaman bir kez UDF çağrılır.
    • UDF'ler hiçbir zaman satır içinde çalışmaz ve bunun yerine her zaman çağrılır.
    • Derlenen ayrım, tüm UDF'lerin doğasında bulunan yinelenen çağrıların yükünden daha az önemlidir.
    • Yine de UDF çağrılarının yükü genellikle pratik düzeyde kabul edilebilir.

Test verileri ve yerel UDF'lerin performansı hakkında açıklama için bkz:

Bellek için iyileştirilmiş tablolar için belge kılavuzu

Bellek için iyileştirilmiş tablolar için dikkat edilmesi gerekenler hakkında bilgi veren diğer makalelere bakın:

  • In-Memory OLTP'ye Geçiş
    • Bir Tablo veya Saklı Yordamın In-Memory OLTP Aktarılıp Aktarılmayacağını Belirleme
    • SQL Server Management Studio'daki İşlem Performansı Analizi raporu, In-Memory OLTP'nin veritabanı uygulamanızın performansını geliştirip geliştirmediğini değerlendirmenize yardımcı olur.
    • Disk tabanlı veritabanı tablosunu In-Memory OLTP'ye geçirmenize yardımcı olması için Bellek İyileştirme Danışmanı'i kullanın.
  • Memory-Optimized Tablolarını Yedekleme, Geri Yükleme ve Kurtarma
    • Bellek için iyileştirilmiş tablolar tarafından kullanılan depolama alanı bellekteki boyutundan çok daha büyük olabilir ve veritabanı yedeklemesinin boyutunu etkiler.
  • İşlemleri Memory-Optimized Tablo
    • Bellek için iyileştirilmiş tablolardaki işlemler için T-SQL'de yeniden deneme mantığı hakkında bilgi içerir.
  • In-Memory OLTP içinTransact-SQL Desteği
    • Bellek için iyileştirilmiş tablolar ve yerel işlemler için desteklenen ve desteklenmeyen T-SQL ve veri türleri.
  • Memory-Optimized Tabloları olan bir Veritabanını bir Kaynak Havuzunabağlama. Bu, isteğe bağlı gelişmiş bir konuyu ele alır.

Yerel süreçler için dokümantasyon kılavuzu

Aşağıdaki makale ve içindekiler tablosundaki alt makaleleri, yerel derlenmiş saklı yordamlarla ilgili ayrıntıları açıklar.

  • yerel olarak derlenmiş saklı yordamları

In-Memory OLTP kullanarak elde ettiğiniz performans artışlarını göstermek için kod sunan makaleler şunlardır:

  • Gösterimi: In-Memory OLTP Performans İyileştirmesi, daha büyük potansiyel performans kazanımlarının küçük ölçekli bir gösterimini sunar.
  • In-Memory OLTP için Örnek Veritabanı daha büyük bir ölçek gösterimi sunar.