Bekletme ilkesiyle Zamana bağlı tablolardaki geçmiş verilerini yönetme

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

Özellikle geçmiş verileri daha uzun süre saklamanız durumunda, zamana bağlı tablolar veritabanı boyutunu normal tablolardan daha fazla artırabilir. Bu nedenle, geçmiş veriler için bekletme ilkesi, her zamansal tablonun yaşam döngüsünü planlamanın ve yönetmenin önemli bir yönüdür. Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği'ndeki zamana bağlı tablolar, bu görevi gerçekleştirmenize yardımcı olan kullanımı kolay saklama mekanizmasıyla birlikte gelir.

Zamansal geçmiş saklama, kullanıcıların esnek eskime ilkeleri oluşturmasına olanak tanıyan tek tek tablo düzeyinde yapılandırılabilir. Geçici saklama uygulamak basittir: Tablo oluşturma veya şema değişikliği sırasında yalnızca bir parametrenin ayarlanmasını gerektirir.

Bekletme ilkesini tanımladıktan sonra Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği, otomatik veri temizleme için uygun geçmiş satırları olup olmadığını düzenli olarak denetlemeye başlar. Eşleşen satırların tanımlanması ve bunların geçmiş tablosundan kaldırılması, sistem tarafından zamanlanan ve çalıştırılan arka plan görevinde saydam olarak gerçekleşir. Geçmiş tablosu satırları için yaş koşulu, SYSTEM_TIME döneminin sonunu temsil eden sütuna göre denetlenir. Örneğin saklama süresi altı aya ayarlanırsa, temizleme için uygun tablo satırları aşağıdaki koşulu karşılar:

ValidTo < DATEADD (MONTH, -6, SYSUTCDATETIME())

Önceki örnekte ValidTo sütununun SYSTEM_TIME dönemin sonuna karşılık geldiğini varsaydık.

Bekletme ilkesini yapılandırma

Geçici tablo için bekletme ilkesini yapılandırmadan önce, önce zamansal geçmiş saklamanın veritabanı düzeyinde etkinleştirilip etkinleştirilmediğini denetleyin.

SELECT is_temporal_history_retention_enabled, name
FROM sys.databases

Veritabanı bayrağı is_temporal_history_retention_enabled varsayılan olarak ON olarak ayarlanır, ancak kullanıcılar ALTER DATABASE deyimiyle değiştirebilir. Ayrıca belirli bir noktaya geri yükleme işleminden sonra otomatik olarak KAPALI olarak ayarlanır. Veritabanınızda zamana bağlı geçmiş saklama temizlemesini etkinleştirmek için aşağıdaki deyimi yürütür:

ALTER DATABASE [<myDB>]
SET TEMPORAL_HISTORY_RETENTION  ON

Önemli

is_temporal_history_retention_enabled KAPALI olsa bile zamana bağlı tablolar için bekletmeyi yapılandırabilirsiniz, ancak bu durumda eski satırlar için otomatik temizleme tetiklenmez.

Bekletme ilkesi, tablo oluşturma sırasında HISTORY_RETENTION_PERIOD parametresi için değer belirtilerek yapılandırılır:

CREATE TABLE dbo.WebsiteUserInfo
(  
    [UserID] int NOT NULL PRIMARY KEY CLUSTERED
  , [UserName] nvarchar(100) NOT NULL
  , [PagesVisited] int NOT NULL
  , [ValidFrom] datetime2 (0) GENERATED ALWAYS AS ROW START
  , [ValidTo] datetime2 (0) GENERATED ALWAYS AS ROW END
  , PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
 )  
 WITH
 (
     SYSTEM_VERSIONING = ON
     (
        HISTORY_TABLE = dbo.WebsiteUserInfoHistory,
        HISTORY_RETENTION_PERIOD = 6 MONTHS
     )
 );

Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği, farklı zaman birimleri kullanarak bekletme süresini belirtmenize olanak tanır: GÜN, HAFTA, AY ve YIL. HISTORY_RETENTION_PERIOD atlanırsa, SONSUZ saklama varsayılır. INFINITE anahtar sözcüğünü açıkça da kullanabilirsiniz.

Bazı senaryolarda, tablo oluşturulduktan sonra bekletmeyi yapılandırmak veya önceden yapılandırılmış değeri değiştirmek isteyebilirsiniz. Bu durumda ALTER TABLE deyimini kullanın:

ALTER TABLE dbo.WebsiteUserInfo
SET (SYSTEM_VERSIONING = ON (HISTORY_RETENTION_PERIOD = 9 MONTHS));

Önemli

SYSTEM_VERSIONING OFF olarak ayarlanması bekletme süresi değerini korumaz . açıkça belirtilmeden SYSTEM_VERSIONING HISTORY_RETENTION_PERIOD ON olarak ayarlanması, SONSUZ saklama süresine neden olur.

Bekletme ilkesinin geçerli durumunu gözden geçirmek için, veritabanı düzeyinde zamansal bekletme etkinleştirme bayrağını tek tek tablolar için bekletme süreleri ile birleştiren aşağıdaki sorguyu kullanın:

SELECT DB.is_temporal_history_retention_enabled,
SCHEMA_NAME(T1.schema_id) AS TemporalTableSchema,
T1.name as TemporalTableName,  SCHEMA_NAME(T2.schema_id) AS HistoryTableSchema,
T2.name as HistoryTableName,T1.history_retention_period,
T1.history_retention_period_unit_desc
FROM sys.tables T1  
OUTER APPLY (select is_temporal_history_retention_enabled from sys.databases
where name = DB_NAME()) AS DB
LEFT JOIN sys.tables T2
ON T1.history_table_id = T2.object_id WHERE T1.temporal_type = 2

Eski satırlar nasıl silinir?

Temizleme işlemi, geçmiş tablosunun dizin düzenine bağlıdır. Yalnızca kümelenmiş dizine (B-tree veya columnstore) sahip geçmiş tablolarında sonlu bekletme ilkesinin yapılandırıldığını fark etmek önemlidir. Sonlu saklama süresi olan tüm zamansal tablolar için eski veri temizleme gerçekleştirmek için bir arka plan görevi oluşturulur. Satır deposu (B-ağaç) kümelenmiş dizini için temizleme mantığı, eski satırı daha küçük parçalar halinde siler (10 bine kadar) veritabanı günlüğü ve GÇ alt sistemi üzerindeki baskıyı en aza indirir. Temizleme mantığı gerekli B ağacı dizinini kullansa da, bekletme süresinden eski satırlar için silme sırası kesin olarak garanti edilemez. Bu nedenle, uygulamalarınızda temizleme sırasına herhangi bir bağımlılık almayın.

Kümelenmiş columnstore temizleme görevi, özellikle geçmiş veriler yüksek hızda oluşturulduğunda çok verimli olan tüm satır gruplarını bir kerede kaldırır (genellikle her biri 1 milyon satır içerir).

Clustered columnstore retention

Mükemmel veri sıkıştırma ve verimli bekletme temizleme, kümelenmiş columnstore dizininin iş yükünüz hızla yüksek miktarda geçmiş veri oluşturduğu senaryolar için mükemmel bir seçim olmasını sağlar. Bu düzen, değişiklik izleme ve denetim, eğilim analizi veya IoT veri alımı için zamansal tablolar kullanan yoğun işlemsel işleme iş yükleri için tipiktir.

Dizinle ilgili dikkat edilmesi gerekenler

Rowstore kümelenmiş dizini olan tablolar için temizleme görevi, dizinin SYSTEM_TIME dönemin sonuna karşılık gelen sütunla başlamasını gerektirir. Böyle bir dizin yoksa, sınırlı bir saklama süresi yapılandıramazsınız:

Msg 13765, Düzey 16, Durum 1

'temporalstagetestdb.dbo.WebsiteUserInfoHistory' geçmiş tablosu gerekli kümelenmiş dizin içermediğinden, sistem sürümü oluşturulmuş 'temporalstagetestdb.dbo.WebsiteUserInfoInfo' geçmiş tablosunda sonlu saklama süresi ayarlanamadı. Geçmiş tablosundaki SYSTEM_TIME döneminin sonuyla eşleşen sütundan başlayarak kümelenmiş sütun deposu veya B ağacı dizini oluşturmayı göz önünde bulundurun.

Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği tarafından oluşturulan varsayılan geçmiş tablosunun bekletme ilkesiyle uyumlu kümelenmiş dizine sahip olduğunu fark etmek önemlidir. Sonlu saklama süresi olan bir tablodaki bu dizini kaldırmaya çalışırsanız, işlem aşağıdaki hatayla başarısız olur:

Msg 13766, Düzey 16, Durum 1

Eski verilerin otomatik olarak temizlenmesi için kullanıldığından kümelenmiş 'WebsiteUserInfoHistory.IX_WebsiteUserInfoHistory' dizini bırakılamıyor. Bu dizini bırakmanız gerekiyorsa ilgili sistem sürümüne sahip zamana bağlı tabloda HISTORY_RETENTION_PERIOD SONSUZ olarak ayarlamayı göz önünde bulundurun.

Geçmiş satırları artan düzende (dönem sonu sütununa göre sıralanmış) eklenirse kümelenmiş columnstore dizininde temizleme en uygun şekilde çalışır. Bu, geçmiş tablosu yalnızca SYSTEM_VERSIONIOING mekanizması tarafından doldurulduğunda her zaman böyledir. Geçmiş tablosundaki satırlar dönem sonu sütununa göre sıralanmamışsa (var olan geçmiş verilerini geçirdiyseniz bu durum geçerli olabilir), en iyi performansı elde etmek için düzgün sıralanmış B ağacı satır deposu dizininin üzerinde kümelenmiş columnstore dizinini yeniden oluşturmanız gerekir.

Sistem sürümü oluşturma işlemi tarafından doğal olarak uygulanan satır gruplarında sıralamayı değiştirebileceğinden, geçmiş tablosunda kümelenmiş columnstore dizinini sonlu bekletme süresiyle yeniden oluşturmaktan kaçının. Geçmiş tablosunda kümelenmiş columnstore dizinini yeniden oluşturmanız gerekiyorsa, normal veri temizleme için gerekli satır gruplarında sıralamayı koruyarak uyumlu B ağacı dizininin üzerinde yeniden oluşturarak bunu yapın. Veri sırası garanti edilmeden kümelenmiş sütun dizini olan mevcut geçmiş tablosuyla zamansal tablo oluşturursanız da aynı yaklaşım benimsenmelidir:

/*Create B-tree ordered by the end of period column*/
CREATE CLUSTERED INDEX IX_WebsiteUserInfoHistory ON WebsiteUserInfoHistory (ValidTo)
WITH (DROP_EXISTING = ON);
GO
/*Re-create clustered columnstore index*/
CREATE CLUSTERED COLUMNSTORE INDEX IX_WebsiteUserInfoHistory ON WebsiteUserInfoHistory
WITH (DROP_EXISTING = ON);

Geçmiş tablosu için kümelenmiş columnstore diziniyle sınırlı saklama süresi yapılandırıldığında, bu tabloda kümelenmemiş ek B ağacı dizinleri oluşturamazsınız:

CREATE NONCLUSTERED INDEX IX_WebHistNCI ON WebsiteUserInfoHistory ([UserName])

Yukarıdaki deyimi yürütme girişimi aşağıdaki hatayla başarısız oluyor:

Msg 13772, Düzey 16, Durum 1

'WebsiteUserInfoHistory' geçici geçmiş tablosunda sınırlı saklama süresi ve kümelenmiş columnstore dizini tanımlandığından kümelenmemiş dizin oluşturulamıyor.

Bekletme ilkesiyle tabloları sorgulama

Eski satırlar temizleme görevi tarafından herhangi bir zamanda ve rastgele sırada silinebildiğinden, zamansal tablodaki tüm sorgular, öngörülemeyen ve tutarsız sonuçlardan kaçınmak için otomatik olarak sonlu bekletme ilkesiyle eşleşen geçmiş satırları filtreler.

Aşağıdaki resimde basit bir sorgunun sorgu planı gösterilmektedir:

SELECT * FROM dbo.WebsiteUserInfo FOR SYSTEM_TIME ALL;

Sorgu planı, geçmiş tablosundaki Kümelenmiş Dizin Taraması işlecinde (vurgulanmış) dönem sonu sütununa (ValidTo) uygulanan ek filtre içerir. Bu örnekte, WebsiteUserInfo tablosunda bir AY bekletme süresinin ayarlandığı varsayılır.

Retention query filter

Ancak, sorgu geçmişi tablosunu doğrudan sorgularsanız, belirtilen saklama süresinden daha eski olan ancak yinelenebilir sorgu sonuçları garantisi olmayan satırlar görebilirsiniz. Aşağıdaki resimde, ek filtreler uygulanmadan geçmiş tablosundaki sorgu için sorgu yürütme planı gösterilmektedir:

Querying history without retention filter

Tutarsız veya beklenmeyen sonuçlar alabileceğiniz için iş mantığınızı saklama süresi dışında okuma geçmişi tablosuna güvenmeyin. Zamansal tablolardaki verileri çözümlemek için FOR SYSTEM_TIME yan tümcesiyle zamansal sorgular kullanmanızı öneririz.

Belirli bir noktaya geri yükleme konusunda dikkat edilmesi gerekenler

Mevcut veritabanını belirli bir zamana geri yükleyerek yeni veritabanı oluşturduğunuzda, veritabanı düzeyinde geçici saklama devre dışı bırakılır. (is_temporal_history_retention_enabled bayrağı KAPALI olarak ayarlanır). Bu işlev, geri yükleme sırasında eski satırları sorgulamadan önce eski satırların kaldırılması konusunda endişelenmeden tüm geçmiş satırları incelemenize olanak tanır. Yapılandırılmış saklama süresinin ötesinde geçmiş verileri incelemek için bunu kullanabilirsiniz.

Bir zamansal tabloda bir AY saklama süresi belirtildiğini varsayalım. Veritabanınız Premium Hizmet katmanında oluşturulduysa, geçmişte 35 güne kadar veritabanı durumuyla veritabanı kopyası oluşturabilirsiniz. Bu, geçmiş tablosunu doğrudan sorgulayarak 65 güne kadar olan geçmiş satırları çözümlemenize olanak tanır.

Zamansal saklama temizlemeyi etkinleştirmek istiyorsanız, belirli bir noktaya geri yüklemeden sonra aşağıdaki Transact-SQL deyimini çalıştırın:

ALTER DATABASE [<myDB>]
SET TEMPORAL_HISTORY_RETENTION  ON

Sonraki adımlar

Uygulamalarınızda zamana bağlı tabloları kullanmayı öğrenmek için Zamana Bağlı Tablolarla Çalışmaya Başlama bölümüne bakın.

Zamana bağlı tablolar hakkında ayrıntılı bilgi için Bkz . Zamana bağlı tablolar.