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'ye Genel Bakış ve Kullanım Senaryoları (müşteri örnek olay incelemelerine başvurular ve başlamak için bilgiler içerir)
- Bellek içi OLTP belgeleri
- Columnstore Dizinleri Kılavuzu
- Gerçek zamanlı operasyonel analiz olarak da bilinen hibrit işlemsel/analitik işleme (HTAP)
Bellek içi OLTP için daha basit ama görsel açıdan daha çekici bir performans tanıtımı için bkz:
- Sürüm: in-memory-oltp-demo-v1.0
- Kaynak kodu: in-memory-oltp-demo-source-code
1. Bellek içi OLTP örneğini yükleyin
Azure portalında AdventureWorksLT
birkaç 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ı
Azure portalında bir sunucuda Premium (DTU) veya İş Açısından Kritik (sanal çekirdek) veritabanı oluşturun. Kaynak
AdventureWorksLT
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.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.T-SQL betiğini SSMS'ye yapıştırın ve betiği yürütün. Deyimlerdeki
MEMORY_OPTIMIZED = ON
CREATE 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.
- Bellek içi OLTP için Örnek Veritabanı'ndaki ostress.exe tartışması.
- Bellek içi OLTP için Örnek Veritabanı.
- ostress.exe yüklemeye yönelik blog.
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
-r500
tekrarlamaları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:
Ö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;
Önceki ostress.exe komut satırının metnini panonuza kopyalayın.
<placeholders>
için parametresini-S -U -P -d
doğru gerçek değerlerle değiştirin.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:
Ö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;
tüm _inmem _ondisk ile değiştirmek için ostress.exe komut satırını düzenleyin.
ostress.exe ikinci kez yeniden çalıştırın ve süre sonucunu yakalayın.
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
Ö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.
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.
- T-SQL betiği, 1. adımda oluşturduğunuz örnek veritabanında gerekli bellek içi nesneleri
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 ...;
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.
İlgili içerik
- Hızlı Başlangıç 1: Daha hızlı T-SQL Performansı için bellek içi OLTP Teknolojileri
- Uygulamanızın performansını artırmak için bellek içi OLTP kullanma
- Bellek içi OLTP depolama alanını izleme
- Blog: Azure SQL Veritabanı bellek içi OLTP
- Bellek içi OLTP
- Columnstore dizinleri
- Columnstore dizinleri ile gerçek zamanlı operasyonel analiz
- Teknik makale: Bellek içi OLTP – SQL Server 2014'te Yaygın İş Yükü Desenleri ve Geçiş Konuları
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin