Azure SQL Veritabanı'de bellek içi örnek

Şunlar için geçerlidir:Azure SQL Veritabanı

Azure SQL Veritabanı'deki bellek içi teknolojiler uygulamanızın performansını artırmanıza ve veritabanınızın maliyetini azaltmanıza olanak tanır. Azure SQL Veritabanı'da bellek içi teknolojileri kullanarak çeşitli iş yükleriyle performans iyileştirmeleri elde edebilirsiniz.

Bu makalede bellek içi OLTP kullanımını gösteren iki örnek ve Azure SQL Veritabanı'de columnstore dizinleri göreceksiniz.

Daha fazla bilgi için bkz.

Bellek içi OLTP için daha basit ama görsel açıdan daha çekici bir performans tanıtımı için bkz:

1. Bellek içi OLTP örneğini yükleyin

Azure portalında AdventureWorksLTbirkaç adımla örnek veritabanı oluşturabilirsiniz. Ardından bu bölümdeki adımlar, veritabanınızı AdventureWorksLT bellek içi OLTP nesneleriyle nasıl zenginleştirebileceğinizi ve performans avantajlarını nasıl gösterebileceğinizi açıklar.

Yükleme adımları

  1. Azure portalında bir sunucuda Premium (DTU) veya İş Açısından Kritik (sanal çekirdek) veritabanı oluşturun. KaynakAdventureWorksLT değerini örnek veritabanına ayarlayın. Ayrıntılı yönergeler için bkz. Azure SQL Veritabanı'da ilk veritabanınızı oluşturma.

  2. ile veritabanına BağlanSQL Server Management Studio (SSMS).

  3. Bellek içi OLTP Transact-SQL betiğini panonuza kopyalayın. T-SQL betiği, 1. adımda oluşturduğunuz örnek veritabanında gerekli bellek içi nesneleri AdventureWorksLT oluşturur.

  4. T-SQL betiğini SSMS'ye yapıştırın ve betiği yürütün. Deyimlerdeki MEMORY_OPTIMIZED = ONCREATE TABLE yan tümcesi çok önemlidir. Örneğin:

CREATE TABLE [SalesLT].[SalesOrderHeader_inmem](
    [SalesOrderID] int IDENTITY NOT NULL PRIMARY KEY NONCLUSTERED ...,
    ...
) WITH (MEMORY_OPTIMIZED = ON);

Hata 40536

T-SQL betiğini çalıştırdığınızda 40536 hatası alırsanız, veritabanının bellek içi nesneleri destekleyip desteklemediğini doğrulamak için aşağıdaki T-SQL betiğini çalıştırın:

SELECT DatabasePropertyEx(DB_Name(), 'IsXTPSupported');

Bunun sonucu 0 , bellek içi desteğin olmadığı ve 1 desteklendiği anlamına gelir. Bellek içi teknolojiler Azure SQL Veritabanı Premium (DTU) ve İş Açısından Kritik (sanal çekirdek) katmanlarında kullanılabilir.

Oluşturulan bellek için iyileştirilmiş öğeler hakkında

Tablolar: Örnek, bellek için iyileştirilmiş aşağıdaki tabloları içerir:

  • SalesLT.Product_inmem
  • SalesLT.SalesOrderHeader_inmem
  • SalesLT.SalesOrderDetail_inmem
  • Demo.DemoSalesOrderHeaderSeed
  • Demo.DemoSalesOrderDetailSeed

SSMS'deki Nesne Gezgini yalnızca bellek için iyileştirilmiş tabloları gösterecek şekilde filtreleyebilirsiniz. Tablolar'a sağ tıkladığınızda Filtre Filtresi Ayarlar> Bellek için İyileştirilmiş'e>> gidin. değeri eşittir 1.

Veya katalog görünümlerini sorgulayabilirsiniz, örneğin:

SELECT is_memory_optimized, name, type_desc, durability_desc
    FROM sys.tables
    WHERE is_memory_optimized = 1;

Yerel olarak derlenmiş saklı yordam: Katalog görünümü sorgusu aracılığıyla inceleyebilirsiniz SalesLT.usp_InsertSalesOrder_inmem :

SELECT uses_native_compilation, OBJECT_NAME(object_id), definition
    FROM sys.sql_modules
    WHERE uses_native_compilation = 1;

2. Örnek OLTP iş yükünü çalıştırma

Aşağıdaki iki saklı yordam arasındaki tek fark, ilk yordamın tabloların bellek için iyileştirilmiş sürümlerini, ikinci yordam ise normal disk içi tabloları kullanmasıdır:

  • SalesLT.usp_InsertSalesOrder_inmem
  • SalesLT.usp_InsertSalesOrder_ondisk

Bu bölümde, iki saklı yordamı stresli düzeylerde yürütmek için kullanışlı ostress.exe yardımcı programının nasıl kullanılacağını göreceksiniz. İki stres çalıştırmasının tamamlanmasının ne kadar sürdüğünü karşılaştırabilirsiniz.

RML yardımcı programlarını ve ostress'i yükleme

İdeal olarak, ostress.exe bir Azure sanal makinesinde (VM) çalıştırmayı planlıyorsunuz. Veritabanınızın aynı Azure bölgesinde bir Azure VM oluşturabilirsiniz AdventureWorksLT . Ancak Azure SQL veritabanınıza bağlanabildiğiniz sürece ostress.exe yerel iş istasyonunuzda çalıştırabilirsiniz.

VM'de veya seçtiğiniz herhangi bir konakta Yeniden Yürütme biçimlendirme dili (RML) yardımcı programlarını yükleyin. Yardımcı programlar ostress.exe içerir.

Daha fazla bilgi için bkz.

ostress.exe için betik

Bu bölümde, ostress.exe komut satırımıza eklenmiş olan T-SQL betiği görüntülenir. Betik, daha önce yüklediğiniz T-SQL betiği tarafından oluşturulan öğeleri kullanır.

ostress.exe çalıştırdığınızda, aşağıdaki stratejilerin ikisini de kullanarak iş yükünü vurgulayan parametre değerlerini geçirmenizi öneririz:

  • kullanarak -n100çok sayıda eşzamanlı bağlantı çalıştırın.
  • kullanarak her bağlantının yüzlerce kez -r500tekrarlamalarını sağlayın.

Ancak, ve gibi -n10-r50 çok daha küçük değerlerle başlamak ve her şeyin çalıştığından emin olmak isteyebilirsiniz.

Aşağıdaki betik, aşağıdaki bellek için iyileştirilmiş tablolara beş satır öğe içeren bir örnek satış siparişi ekler:

  • SalesLT.SalesOrderHeader_inmem
  • SalesLT.SalesOrderDetail_inmem
DECLARE
    @i int = 0,
    @od SalesLT.SalesOrderDetailType_inmem,
    @SalesOrderID int,
    @DueDate datetime2 = sysdatetime(),
    @CustomerID int = rand() * 8000,
    @BillToAddressID int = rand() * 10000,
    @ShipToAddressID int = rand() * 10000;

INSERT INTO @od
    SELECT OrderQty, ProductID
    FROM Demo.DemoSalesOrderDetailSeed
    WHERE OrderID= cast((rand()*60) as int);

WHILE (@i < 20)
BEGIN;
    EXECUTE SalesLT.usp_InsertSalesOrder_inmem @SalesOrderID OUTPUT,
        @DueDate, @CustomerID, @BillToAddressID, @ShipToAddressID, @od;
    SET @i = @i + 1;
END

ostress.exe için önceki T-SQL betiğinin _ondisk sürümünü oluşturmak için, _inmem alt dizesinin her iki örneğini de _ondisk ile değiştirirsiniz. Bu değişiklikler tabloların ve saklı yordamların adlarını etkiler.

önce _inmem stres iş yükünü çalıştırın

ostress.exe komut satırımızı çalıştırmak için bir RML Cmd İstemi penceresi kullanabilirsiniz. Komut satırı parametreleri ostress'i şu adrese yönlendirir:

  • 100 bağlantıyı eşzamanlı olarak çalıştırın (-n100).
  • Her bağlantının T-SQL betiğini 50 kez çalıştırmasını sağlayın (-r50).
ostress.exe -n100 -r50 -S<servername>.database.windows.net -U<login> -P<password> -d<database> -q -Q"DECLARE @i int = 0, @od SalesLT.SalesOrderDetailType_inmem, @SalesOrderID int, @DueDate datetime2 = sysdatetime(), @CustomerID int = rand() * 8000, @BillToAddressID int = rand() * 10000, @ShipToAddressID int = rand()* 10000; INSERT INTO @od SELECT OrderQty, ProductID FROM Demo.DemoSalesOrderDetailSeed WHERE OrderID= cast((rand()*60) as int); WHILE (@i < 20) begin; EXECUTE SalesLT.usp_InsertSalesOrder_inmem @SalesOrderID OUTPUT, @DueDate, @CustomerID, @BillToAddressID, @ShipToAddressID, @od; set @i += 1; end"

Önceki ostress.exe komut satırını çalıştırmak için:

  1. Önceki çalıştırmalar tarafından eklenen tüm verileri silmek için SSMS'de aşağıdaki komutu çalıştırarak veritabanı veri içeriğini sıfırlayın:

    EXECUTE Demo.usp_DemoReset;
    
  2. Önceki ostress.exe komut satırının metnini panonuza kopyalayın.

  3. <placeholders> için parametresini -S -U -P -d doğru gerçek değerlerle değiştirin.

  4. Düzenlenmiş komut satırınızı bir RML Cmd penceresinde çalıştırın.

Sonuç bir süredir

ostress.exe tamamlandığında, çalıştırma süresini RML Cmd penceresinde çıktının son satırı olarak yazar. Örneğin, daha kısa bir test çalıştırması yaklaşık 1,5 dakika sürdü:

11/12/15 00:35:00.873 [0x000030A8] OSTRESS exiting normally, elapsed time: 00:01:31.867

Sıfırlama, _ondisk için düzenleme ve yeniden çalıştırma

_inmem çalıştırmasının sonucunu aldıktan sonra, _ondisk çalıştırması için aşağıdaki adımları gerçekleştirin:

  1. Önceki çalıştırma tarafından eklenen tüm verileri silmek için SSMS'de aşağıdaki komutu çalıştırarak veritabanını sıfırlayın:

    EXECUTE Demo.usp_DemoReset;
    
  2. tüm _inmem _ondisk ile değiştirmek için ostress.exe komut satırını düzenleyin.

  3. ostress.exe ikinci kez yeniden çalıştırın ve süre sonucunu yakalayın.

  4. Veritabanını yeniden sıfırlayın (büyük miktarda test verisi olabilecek verileri sorumlu bir şekilde silmek için).

Beklenen karşılaştırma sonuçları

Bellek içi testlerimiz, bu basit iş yükü için performansın dokuz kat arttığını ve veritabanıyla ostress aynı Azure bölgesinde bir Azure VM üzerinde çalıştığını gösterdi.

3. Bellek içi analiz örneğini yükleyin

Bu bölümde, bir columnstore dizini kullanırken GÇ ve istatistik sonuçlarını geleneksel bir b ağacı diziniyle karşılaştıracaksınız.

OLTP iş yükünde gerçek zamanlı analiz için genellikle en iyisi kümelenmemiş columnstore dizini kullanmaktır. Ayrıntılar için bkz . Columnstore Dizinleri Açıklanan.

Columnstore analiz testini hazırlama

  1. Örnekten yeni AdventureWorksLT bir veritabanı oluşturmak için Azure portalını kullanın.

    • Tam olarak bu adı kullanın.
    • Herhangi bir Premium hizmet katmanı seçin.
  2. sql_in memory_analytics_sample panonuza kopyalayın.

    • T-SQL betiği, 1. adımda oluşturduğunuz örnek veritabanında gerekli bellek içi nesneleri AdventureWorksLT oluşturur.
    • Betik boyut tabloları ve iki olgu tablosu oluşturur. Olgu tabloları her birinde 3,5 milyon satırla doldurulur.
    • Betiğin tamamlanması 15 dakika sürebilir.
  3. T-SQL betiğini SSMS'ye yapıştırın ve betiği yürütün. deyimindeki CREATE INDEX COLUMNSTORE anahtar sözcüğü çok önemlidir:CREATE NONCLUSTERED COLUMNSTORE INDEX ...;

  4. En son uyumluluk düzeyi olan SQL Server 2022 (160) olarak ayarlayın AdventureWorksLT : ALTER DATABASE AdventureworksLT SET compatibility_level = 160;

Anahtar tablolar ve columnstore dizinleri

  • dbo.FactResellerSalesXL_CCI, veri düzeyinde gelişmiş sıkıştırmaya sahip kümelenmiş columnstore dizini olan bir tablodur.

  • dbo.FactResellerSalesXL_PageCompressed, yalnızca sayfa düzeyinde sıkıştırılmış eşdeğer bir normal kümelenmiş dizine sahip bir tablodur.

4. Columnstore dizinini karşılaştırmak için anahtar sorgular

Performans geliştirmelerini görmek için çalıştırabileceğiniz birkaç T-SQL sorgu türü vardır. T-SQL betiğinin 2. adımında bu sorgu çiftine dikkat edin. Yalnızca bir satırda farklılık gösterir:

  • FROM FactResellerSalesXL_PageCompressed AS a
  • FROM FactResellerSalesXL_CCI AS a

Kümelenmiş columnstore dizini tabloda yer alır FactResellerSalesXL_CCI .

Aşağıdaki T-SQL betiği, her sorgu için SET STATISTICS GÇ ve SET STATISTICS TIME kullanarak mantıksal G/Ç etkinliği ve zaman istatistiklerini yazdırır.

/*********************************************************************
Step 2 -- Overview
-- Page Compressed BTree table v/s Columnstore table performance differences
-- Enable actual Query Plan in order to see Plan differences when Executing
*/
-- Ensure Database is in 130 compatibility mode
ALTER DATABASE AdventureworksLT SET compatibility_level = 160
GO

-- Execute a typical query that joins the Fact Table with dimension tables
-- Note this query will run on the Page Compressed table, Note down the time
SET STATISTICS IO ON
SET STATISTICS TIME ON
GO

SELECT c.Year
    ,e.ProductCategoryKey
    ,FirstName + ' ' + LastName AS FullName
    ,count(SalesOrderNumber) AS NumSales
    ,sum(SalesAmount) AS TotalSalesAmt
    ,Avg(SalesAmount) AS AvgSalesAmt
    ,count(DISTINCT SalesOrderNumber) AS NumOrders
    ,count(DISTINCT a.CustomerKey) AS CountCustomers
FROM FactResellerSalesXL_PageCompressed AS a
INNER JOIN DimProduct AS b ON b.ProductKey = a.ProductKey
INNER JOIN DimCustomer AS d ON d.CustomerKey = a.CustomerKey
Inner JOIN DimProductSubCategory AS e on e.ProductSubcategoryKey = b.ProductSubcategoryKey
INNER JOIN DimDate AS c ON c.DateKey = a.OrderDateKey
GROUP BY e.ProductCategoryKey,c.Year,d.CustomerKey,d.FirstName,d.LastName
GO
SET STATISTICS IO OFF
SET STATISTICS TIME OFF
GO


-- This is the same Prior query on a table with a clustered columnstore index CCI
-- The comparison numbers are even more dramatic the larger the table is (this is an 11 million row table only)
SET STATISTICS IO ON
SET STATISTICS TIME ON
GO
SELECT c.Year
    ,e.ProductCategoryKey
    ,FirstName + ' ' + LastName AS FullName
    ,count(SalesOrderNumber) AS NumSales
    ,sum(SalesAmount) AS TotalSalesAmt
    ,Avg(SalesAmount) AS AvgSalesAmt
    ,count(DISTINCT SalesOrderNumber) AS NumOrders
    ,count(DISTINCT a.CustomerKey) AS CountCustomers
FROM FactResellerSalesXL_CCI AS a
INNER JOIN DimProduct AS b ON b.ProductKey = a.ProductKey
INNER JOIN DimCustomer AS d ON d.CustomerKey = a.CustomerKey
Inner JOIN DimProductSubCategory AS e on e.ProductSubcategoryKey = b.ProductSubcategoryKey
INNER JOIN DimDate AS c ON c.DateKey = a.OrderDateKey
GROUP BY e.ProductCategoryKey,c.Year,d.CustomerKey,d.FirstName,d.LastName
GO

SET STATISTICS IO OFF
SET STATISTICS TIME OFF
GO

P2 fiyatlandırma katmanına sahip bir veritabanında, geleneksel dizinle karşılaştırıldığında kümelenmiş columnstore dizinini kullanarak bu sorgu için yaklaşık dokuz kat daha fazla performans kazancı bekleyebilirsiniz. P15 ile columnstore dizinini kullanarak performans kazancının yaklaşık 57 katını elde edebilirsiniz.