Sistem sürümlü zaman bazlı tablolarla bellek açısından iyileştirilmiş tablolar

Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri Azure SQL Yönetilen Örnek

Bellek optimize edilmiş tablolar için sistem sürümündeki zaman tabloları, bellek içi OLTP iş yükleriyle toplanan verilerin üzerinde veri denetimi ve zaman analizinin gerektirdiği senaryolar için maliyet etkin bir çözüm sunar.

Note

Bellek optimize edilmiş zamansal tablolar yalnızca SQL Server ve Azure SQL Yönetilen Örnek'te kullanılabilir. Bellek için iyileştirilmiş tablolar ve zamana bağlı tablolar Azure SQL Veritabanı'nda bağımsız olarak kullanılabilir.

Overview

Sistem sürümüyle zaman damgalı tablolar, veri değişikliklerinin tam geçmişini otomatik olarak tutar ve belirli bir zaman diliminde analiz için pratik Transact-SQL uzantılarını kullanıma sunar. Tipik bir senaryoda, veri geçmişi uzun süre (birkaç ay, hatta yıllar) saklanır, ancak düzenli olarak sorgulanmaz.

Veri denetimi ve zaman tabanlı analiz, özellikle çok büyük sayıda isteği işleyen ve bellek içi OLTP teknolojisinin kullanıldığı OLTP sistemlerinde farklı ortamlarda talep edilebilir. Ancak, zamansal senaryolarda bellek için iyileştirilmiş tabloların kullanılması zordur çünkü oluşturulan çok fazla geçmiş verisi genellikle kullanılabilir RAM sınırını aşıyor. Aynı zamanda, eskidikçe daha az sıklıkta erişilen salt okunur geçmiş verileri depolamak için RAM kullanmak en uygun çözüm değildir.

Bellek için optimize edilmiş tablolar için sistem sürümlü zamansal tablolar, yüksek işlem hacmi ve kilitsiz eşzamanlılık sağlar. Güncel verileri (zamansal tablo) depolamak için bellek içi tablolar ve tarihsel veriler için disk tabanlı tablolar kullanarak büyük miktarda geçmiş verisi depolayabilirsiniz. DML işlemleri üzerindeki etkisi, yakın geçmişi depolayan ve yerel olarak derlenmiş koddan DML'lerin yürütülmesine olanak tanıyan dahili, otomatik olarak oluşturulan bellek için optimize edilmiş bir hazırlama tablosu kullanılarak azaltılır.

Aşağıdaki diyagramda bu mimari gösterilmektedir.

Zamansal bellek içi mimari diyagramı.

Uygulama ayrıntıları

Sistem tarafından sürümlenmiş bellek için iyileştirilmiş bir tablo oluşturduğunuzda, aşağıdaki önemli noktalara dikkat edin. Söz dizimi seçenekleri ve bir örnek için bkz CREATE TABLE. .

  • Yalnızca dayanıklı bellek için iyileştirilmiş tablolar sistem sürümüne dönüştürülebilir (DURABILITY = SCHEMA_AND_DATA).

  • Bellek optimize edilmiş sistem versiyonlu bir tablo için geçmiş tablosu, ister siz oluştursanız ister sistem oluşturuyor, disk tabanlı olmalıdır.

  • Yerel derlenmiş T-SQL modüllerinde yalnızca mevcut bellek tablosunu etkileyen sorguları kullanabilirsiniz. Yerel derlenen modüller bu maddeyi FOR SYSTEM TIME desteklemez, ancak ad hoc sorgular ve yerel olmayan modüller bu maddeyi bellek optimize edilmiş tablolara karşı kullanabilir.

  • SYSTEM_VERSIONING = ON ile sistem, bellek için optimize edilmiş geçerli bir tablodaki güncelleştirme ve silme işlemlerinden kaynaklanan en son sistem sürümlü değişiklikleri kabul etmek için otomatik olarak bellek için optimize edilmiş bir iç hazırlama tablosu oluşturur.

  • Asenkron veri temizleme görevi, verileri düzenli olarak dahili bellek optimize edilmiş aşamalama tablosundan disk tabanlı geçmiş tablosuna taşır. Bu veri temizleme mekanizması, iç bellek arabelleklerini üst nesnelerinin bellek tüketiminin yüzde 10'undan azında tutar. Bellek için optimize edilmiş sistem sürümlü zamansal tablonun toplam bellek tüketimini sys.dm_db_xtp_memory_consumers sorgulayıp, dahili bellek optimize edilmiş aşamalama tablosu ile mevcut zaman tablosu için verileri özetleyerek takip edebilirsiniz.

  • Veri temizleme işlemini manuel olarak gerçekleştirmek için sp_xtp_flush_temporal_history komutunu çalıştırın.

  • SYSTEM_VERSIONING = OFF ile veya sütun ekleyerek, kaldırarak ya da değiştirerek sistem sürümlü bir tablonun şemasını değiştirdiğinizde, dahili hazırlama arabelleğinin tüm içeriği disk tabanlı geçmiş tablosuna taşınır.

  • Geçmiş verilerin sorgulanması etkin bir şekilde anlık görüntü yalıtım düzeyi altındadır ve her zaman bellek içi hazırlama arabelleği ile yinelenenleri olmayan disk tabanlı tablo arasında bir birleşim döndürür.

  • ALTER TABLE tablo şemasını dahili olarak değiştiren işlemler, bir veri boşaltma işlemi gerçekleştirmelidir; bu da işlemin daha uzun sürmesine neden olabilir.

İç bellekle optimize edilmiş hazırlama tablosu

Sistem, DML işlemlerini optimize etmek için bellek optimize edilmiş bir iç hazırlama tablosu oluşturur.

  • Tablo adı şu formatı kullanır: Memory_Optimized_History_Table_<object_id> burada <object_id> mevcut zaman tablosunun tanımlayıcısıdır.

  • Tablo, mevcut zamansal tablonun şemasını ve buna ek olarak bir bigint sütununu kopyalar. Bu ekstra sütun, dahili tarih tamponuna taşınan satırların benzersizliğini garanti eder.

  • Ek sütun şu ad biçimine sahiptir: Change_ID[<suffix>], tablonun zaten bir <suffix> sütunu olması durumunda isteğe bağlı olarak Change_ID eklenir.

  • Hazırlama tablosundaki fazla bigint sütunu nedeniyle sistem sürümlü bellek iyileştirilmiş bir tablonun en büyük satır boyutu 8 bayt azaltılır. Maksimum şu anda 8.052 bayt.

  • Dahili bellek optimize edilmiş aşamalama tablosu, SQL Server Management Studio'nun Nesne Gezgini'ında görünmüyor.

  • Bu tablo hakkında meta verileri ve mevcut zaman tablosuyla bağlantısını sys.internal_tables'de bulabilirsiniz.

Veri temizleme görevi

Veri boşaltma görevi düzenli olarak çalışır ve herhangi bir bellek için optimize edilmiş tablonun veri taşınması için bellek boyutuna dayalı bir koşulu karşılayıp karşılamadığını denetler. Veri hareketi, dahili aşamalama tablosunun bellek tüketimi mevcut zamansal tablonun bellek tüketiminin yüzde sekize ulaştığında başlar.

Veri temizleme görevi, mevcut iş yüküne bağlı olarak değişen bir zamanlamayla düzenli olarak etkinleştirilir. Yoğun bir iş yüküyle görev 5 saniyede bir kadar sık çalışır. Hafif bir iş yüküyle sıklık dakikada bir artar. İç bellekle optimize edilmiş, temizleme gerektiren her hazırlama tablosu için bir iş parçacığı oluşturulur.

Veri silme, bu kayıtları disk tabanlı geçmiş tablosuna taşımak için, bellek içi arabellekten halihazırda çalışan en eski işlemden daha eski olan tüm kayıtları siler.

sp_xtp_flush_temporal_history çalıştırıp şema ve tablo adını belirterek veri temizleme işlemi yürütebilirsiniz:

EXEC sys.sp_xtp_flush_temporal_history <schema_name>, <object_name>;

Sistem iç zamanlamaya göre veri temizleme görevini yürüttüğünde olduğu gibi aynı veri taşıma işlemi çağrılır.