In-Memory Database ailesinden olan Memory-Optimzed TempDB Metadata, tempdb üzerindeki metadatanın In-Memory mimarisi kullanılarak disk okumalarından kaçılınmasını sağlamaktadır. Bu sayede tempdb üzerinde oluşacak darboğazlardan kurtulunması hedeflenmiştir.
Demo
tempdb üzerinde bir tablo oluşturup SELECT atan bir procedure oluturuyorum ve sonrasın bunu ostress.exe ile tetikliyorum.
CREATE PROC usp_MemoryOptimizedTempdbTest AS BEGIN IF OBJECT_ID('tempdb..#temp1') IS NOT NULL DROP TABLE #temp1; SELECT TOP 1000 * INTO #temp1 FROM Posts WITH(NOLOCK) SELECT * FROM #temp1 t JOIN StackOverflow2010.dbo.PostLinks pl ON pl.PostId=t.Id END
Memory-Optimized Tempdb’yi açıp kapatmak için aşağıdaki Syntax’ı kullanıyorum.
ALTER SERVER CONFIGURATION SET MEMORY_OPTIMIZED TEMPDB_METADATA = ON
Özellik üzerinde değişiklik yapmak SQL Restart gerektirmektedir.
SELECT SERVERPROPERTY('IsTempdbMetadataMemoryOptimized')
Memory-Optimized açıkken ve kapalıyken yaptığım demo sonuçları aşağıdaki gibidir. SQL Server tempdb üzerinde ciddi derecede disk okumalarından kurtulmuş gözükmektedir.
Kapalı
Açık
*Var olan PAGEIOLATCH değerleri Post ve PostsLinks tablolarındaki okumalar içindir.
Kısıtlamalar
- Tek bir transaction içerisinde tempdb objelerini görüntülemeye ve ardından memory-optimized table üzerinde işlem yapmaya çalışıldığında hata alınacaktır.
- Memory-Optimized table lock ve isolation hint’leri desteklememktedir. Daime READ COMMITTED olarak çalışmaktadır.
- Memory-Optimized tablolar üzerinde Columnstore index oluşturulamamaktadır.
Not : Eğer başlangıç parametresi olarak -f kullanılırsa Memory-Optimized Tempdb disable olacaktır.