Aracılığıyla paylaş


Bellek-Optimizasyonlu Tabloları Bölümlemek için Uygulama Kalıbı

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

In-Memory OLTP, performans kaynaklarını nispeten güncel verilere yoğunlaştıran bir uygulama tasarım desenini destekler. Bu düzen, geçerli veriler eski verilerden çok daha sık okunduğunda veya güncelleştirildiğinde uygulanabilir. Bu durumda, geçerli verilerin etkin veya sıcak olduğunu ve eski verilerin soğuk olduğunu söyleriz.

Ana fikir, sık erişimli verileri bellek için iyileştirilmiş bir tabloda depolamaktır. Haftalık veya aylık olarak, soğuğa dönüşen eski veriler bölümlenmiş bir tabloya taşınır. Bölümlenmiş tablonun verileri bellekte değil diskte veya başka bir sabit sürücüde depolanır.

Bu tasarım genellikle, taşıma sürecinin sıcak ve soğuk verileri verimli bir şekilde ayırt etmesini sağlamak için datetime anahtarı kullanır.

Gelişmiş bölümleme

Tasarım, bellek için optimize edilmiş bir bölüme de sahip olan bölümlenmiş bir tabloyu taklit etmeyi amaçlıyor. Bu tasarımın çalışması için tabloların ortak bir şemayı paylaştığından emin olmanız gerekir. Bu makalenin devamında yer alan kod örneği tekniğini gösterir.

Yeni verilerin tanımı gereği sık erişimli olduğu varsayılır. Sık erişimli veriler, bellek ile optimize edilen tabloya eklenir ve güncellenir. Soğuk veriler geleneksel bölümlenmiş tabloda tutulur. Saklı prosedür düzenli aralıklarla yeni bir bölüm ekler. Bölüm, bellek için optimize edilmiş tablodan taşınan en güncel soğuk verileri içerir.

Bir işlem yalnızca sıcak veriye ihtiyaç duyuyorsa verilere erişmek için yerel derlemeli saklı yordamlar kullanabilir. Sık erişimli veya soğuk verilere erişebilecek işlemler, bellek için iyileştirilmiş tabloyu bölümlenmiş tabloyla birleştirmek için yorumlanmış Transact-SQL kullanmalıdır.

Bölüm ekle

Yeni soğuyan veriler bölümlenmiş tabloya taşınmalıdır. Bu düzenli bölüm değiştirme adımları aşağıdaki gibidir:

  1. Bellek için optimize edilmiş tablodaki veriler için, sıcak ve yeni soğumuş veriler arasındaki sınır veya kesim olan tarih saat değerini belirleyin.
  2. In-Memory OLTP tablosundaki yeni soğuk verileri cold_staging tablosuna ekleyin.
  3. Bellek iyileştirmeli tablodan aynı soğuk veriyi silin.
  4. cold_staging tablosunu bir bölüme değiştirin.
  5. Bölümü ekleyin.

Bakım süresi

Önceki adımlardan biri, bellek optimizasyonlu tablodan yeni oluşmuş soğuk verileri silmektir. Bu silme ile yeni bölümü ekleyen son adım arasında bir zaman aralığı vardır. Bu aralık boyunca, yeni soğuk verileri okumaya çalışan tüm uygulamalar başarısız olur.

İlgili bir örnek için Uygulama Düzeyinde Bölümleme'ye bakın.

Kod Örneği

Aşağıdaki Transact-SQL örneği, yalnızca sunu kolaylığı için bir dizi daha küçük kod bloğunda görüntülenir. Testiniz için hepsini tek bir büyük kod bloğuna ekleyebilirsiniz.

T-SQL örneği, bölümlenmiş disk tabanlı bir tabloyla bellek için iyileştirilmiş bir tablonun nasıl kullanılacağını gösterir.

T-SQL örneğinin ilk aşamaları veritabanını oluşturur ve sonra veritabanında tablolar gibi nesneler oluşturur. Sonraki aşamalarda bellek için iyileştirilmiş bir tablodaki verilerin bölümlenmiş tabloya nasıl taşınacakları gösterilir.

veritabanı oluşturun

T-SQL örneğinin bu bölümü bir test veritabanı oluşturur. Veritabanı hem bellek için iyileştirilmiş tabloları hem de bölümlenmiş tabloları destekleyecek şekilde yapılandırılmıştır.

CREATE DATABASE PartitionSample;
GO

-- Add a FileGroup, enabled for In-Memory OLTP.
-- Change file path as needed.

ALTER DATABASE PartitionSample
    ADD FILEGROUP PartitionSample_mod
    CONTAINS MEMORY_OPTIMIZED_DATA;

ALTER DATABASE PartitionSample
    ADD FILE(
        NAME = 'PartitionSample_mod',
        FILENAME = 'c:\data\PartitionSample_mod')
    TO FILEGROUP PartitionSample_mod;
GO

Sıcak veriler için bellek optimize edilmiş bir tablo oluşturun

Bu bölüm, en son verileri tutan bellek için iyileştirilmiş tabloyu oluşturur ve bu da çoğunlukla sık erişimli verilerdir.

USE PartitionSample;
GO

-- Create a memory-optimized table for the HOT Sales Order data.
-- Notice the index that uses datetime2.

CREATE TABLE dbo.SalesOrders_hot (
   so_id INT IDENTITY PRIMARY KEY NONCLUSTERED,
   cust_id INT NOT NULL,
   so_date DATETIME2 NOT NULL INDEX ix_date NONCLUSTERED,
   so_total MONEY NOT NULL,
   INDEX ix_date_total NONCLUSTERED (so_date desc, so_total desc)
) WITH (MEMORY_OPTIMIZED=ON);
GO

Soğuk veriler için bölümlenmiş tablo oluşturma

Bu bölüm, soğuk verileri tutan bölümlenmiş tabloyu oluşturur.

-- Create a partition and table for the COLD Sales Order data.
-- Notice the index that uses datetime2.

CREATE PARTITION FUNCTION [ByDatePF](datetime2) AS RANGE RIGHT
   FOR VALUES();
GO

CREATE PARTITION SCHEME [ByDateRange]
   AS PARTITION [ByDatePF]
   ALL TO ([PRIMARY]);
GO

CREATE TABLE dbo.SalesOrders_cold (
   so_id INT NOT NULL,
   cust_id INT NOT NULL,
   so_date DATETIME2 NOT NULL,
   so_total MONEY NOT NULL,
   CONSTRAINT PK_SalesOrders_cold PRIMARY KEY (so_id, so_date),
   INDEX ix_date_total NONCLUSTERED (so_date desc, so_total desc)
) ON [ByDateRange](so_date);
GO

Taşıma sırasında soğuk verileri depolamak için tablo oluşturma

Bu bölüm cold_staging tablosunu oluşturur. İki tablodan gelen sıcak ve soğuk verileri birleştiren bir görünüm de oluşturulur.

-- A table used to briefly stage the newly cold data, during moves to a partition.

CREATE TABLE dbo.SalesOrders_cold_staging (
   so_id INT NOT NULL,
   cust_id INT NOT NULL,
   so_date datetime2 NOT NULL,
   so_total MONEY NOT NULL,
   CONSTRAINT PK_SalesOrders_cold_staging PRIMARY KEY (so_id, so_date),
   INDEX ix_date_total NONCLUSTERED (so_date desc, so_total desc),
   CONSTRAINT CHK_SalesOrders_cold_staging CHECK (so_date >= '1900-01-01')
);
GO

-- A view, for retrieving the aggregation of hot plus cold data.

CREATE VIEW dbo.SalesOrders
AS SELECT so_id,
          cust_id,
          so_date,
          so_total,
          1 AS 'is_hot'
       FROM dbo.SalesOrders_hot
   UNION ALL
   SELECT so_id,
          cust_id,
          so_date,
          so_total,
          0 AS 'is_cold'
       FROM dbo.SalesOrders_cold;
GO

Saklı yordamı oluştur

Bu bölüm, düzenli aralıklarla çalıştırdığınız saklı yordamı oluşturur. Prosedür, bellekle optimize edilmiş tablodaki yeni soğuyan verileri bölümlenmiş tabloya taşır.

-- A stored procedure to move all newly cold sales orders data
-- to its staging location.

CREATE PROCEDURE dbo.usp_SalesOrdersOffloadToCold @splitdate datetime2
   AS
   BEGIN
      BEGIN TRANSACTION;

      -- Insert the cold data as a temporary heap.
      INSERT INTO dbo.SalesOrders_cold_staging WITH (TABLOCKX)
      SELECT so_id , cust_id , so_date , so_total
         FROM dbo.SalesOrders_hot WITH (serializable)
         WHERE so_date <= @splitdate;

      -- Delete the moved data from the hot table.
      DELETE FROM dbo.SalesOrders_hot WITH (SERIALIZABLE)
         WHERE so_date <= @splitdate;

      -- Update the partition function, and switch in the new partition.
      ALTER PARTITION SCHEME [ByDateRange] NEXT USED [PRIMARY];

      DECLARE @p INT = (
        SELECT MAX(partition_number)
            FROM sys.partitions
            WHERE object_id = OBJECT_ID('dbo.SalesOrders_cold'));

      EXEC sp_executesql
        N'ALTER TABLE dbo.SalesOrders_cold_staging
            SWITCH TO dbo.SalesOrders_cold partition @i',
        N'@i int',
        @i = @p;

      ALTER PARTITION FUNCTION [ByDatePF]()
      SPLIT RANGE( @splitdate);

      -- Modify a constraint on the cold_staging table, to align with new partition.
      ALTER TABLE dbo.SalesOrders_cold_staging
         DROP CONSTRAINT CHK_SalesOrders_cold_staging;

      DECLARE @s nvarchar( 100) = CONVERT( nvarchar( 100) , @splitdate , 121);
      DECLARE @sql nvarchar( 1000) = N'alter table dbo.SalesOrders_cold_staging 
         add constraint CHK_SalesOrders_cold_staging check (so_date > ''' + @s + ''')';
      PRINT @sql;
      EXEC sp_executesql @sql;

      COMMIT;
END;
GO

Örnek verileri hazırlayın ve saklı yordamı tanıtın.

Bu bölüm, örnek veriler oluşturur ve ekler, ardından saklı yordamı örnek olarak çalıştırır.

-- Insert sample values into the hot table.
INSERT INTO dbo.SalesOrders_hot VALUES(1,SYSDATETIME(), 1);
GO
INSERT INTO dbo.SalesOrders_hot VALUES(1, SYSDATETIME(), 1);
GO
INSERT INTO dbo.SalesOrders_hot VALUES(1, SYSDATETIME(), 1);
GO

-- Verify that the hot data is in the table, by selecting from the view.
SELECT * FROM dbo.SalesOrders;
GO

-- Treat all data in the hot table as cold data:
-- Run the stored procedure, to move (offload) all sales orders to date to cold storage.
DECLARE @t datetime2 = SYSDATETIME();
EXEC dbo.usp_SalesOrdersOffloadToCold @t;

-- Again, read hot plus cold data from the view.
SELECT * FROM dbo.SalesOrders;
GO

-- Retrieve the name of every partition.
SELECT OBJECT_NAME( object_id) , * FROM sys.dm_db_partition_stats ps
   WHERE object_id = OBJECT_ID( 'dbo.SalesOrders_cold');

-- Insert more data into the hot table.
INSERT INTO dbo.SalesOrders_hot VALUES(2, SYSDATETIME(), 1);
GO
INSERT INTO dbo.SalesOrders_hot VALUES(2, SYSDATETIME(), 1);
GO
INSERT INTO dbo.SalesOrders_hot VALUES(2, SYSDATETIME(), 1);
GO

-- Read hot plus cold data from the view.
SELECT * FROM dbo.SalesOrders;
GO

-- Again, run the stored procedure, to move all sales orders to date to cold storage.
DECLARE @t datetime2 = SYSDATETIME();
EXEC dbo.usp_SalesOrdersOffloadToCold @t;

-- Read hot plus cold data from the view.
SELECT * FROM dbo.SalesOrders;
GO

-- Again, retrieve the name of every partition.
-- The stored procedure can modify the partitions.
SELECT OBJECT_NAME( object_id) , partition_number , row_count
  FROM sys.dm_db_partition_stats ps
  WHERE object_id = OBJECT_ID( 'dbo.SalesOrders_cold')
    AND index_id = 1;

Tüm tanıtım nesnelerini bırak

Deneme testi veritabanını test sisteminizin dışında temizlemeyi unutmayın.

-- You must first leave the context of the PartitionSample database.

-- USE <A-Database-Name-Here>;
GO

DROP DATABASE PartitionSample;
GO

Ayrıca Bkz.

tablolarıMemory-Optimized