Bu yazımızda sql server 2005 ile hayatımıza giren Instant File Initialization özelliğini anlatmaya çalışacağız. Kurulum esnasında bize öneri olarak sunulan bu özelliğin performans anlamında katkılarını örneklerle göreceğiz. Öncelikle bir veritabanı oluşturulduğunda, genişletildiğinde (auto growth) veya geri yüklendiğinde (restore) diskten alan talebinde bulunulur ve ilgili alan işletim sistemi tarafından kullanılmayan disk alanı ile doldurulur. Bu, disk üzerinde 0’larla doldurulması gereken bir işlem olup zaman alabilmektedir. IFI özelliği aktif olsaydı eğer sistemin belirli işlemler için alan ayırması gerektiğinde, data dosyaları için 0 ile doldurma işlemi yapılmadan istenilen alan tanımlanmış olacaktı. Böylece uzun zaman alacak işlemler kısa sürede tamamlanabilir. Ayrıca acil durumlarda kesinti süresi azaltılarak SQL Server performansında iyileştirme yapılır. Kurulum esnasında bu özelliği nasıl aktif edeceğimizi ve sonuçlarını görelim.


Sql Server 2016’dan sonra kurulum aşamasında IFI aktif edilebilir. Bu noktada varsayılan olarak NT Service\MSSQLSERVER seçilebildiği gibi domain kullanıcısı da Account Name bölümüne girilebilmektedir. Burada dikkat edilmesi gereken nokta egitim\administrator kullanıcısının SQL Server için yetkili bir kullanıcı olmasıdır. IFI özelliğinin aktiflik durumunu Sql Server kurulumunu yaptıktan sonra farklı yollarla kontrol edebiliriz. Bu şekilde kurulumu gerçekleştirdikten sonra aşağıdaki sorguyu SSMS üzerinden çalıştırıyoruz.
1 2 3 |
SELECT servicename, instant_file_initialization_enabled FROM sys.dm_server_services WHERE servicename like 'SQL Server (%'; |
Kurulum esnasında özelliği aktif etmeyi kaçırırsak eğer Windows çalıştır kısmına secpol.msc yazarak ilgili bölümden aktif edebiliriz.

Görsel 5: Sql Server yetkili kullanıcısı ‘Add User or Group’ menüsünden eklenerek aktif hale getirilebilir.
Uyarı: İlgili kısım güncellendikten sonra Sql Server Configuration Manager kısmından servis restart edilmelidir.

Instant File Initialization özelliği kapalı olan bir makinede, 20 GB olacak şekilde test veritabanı oluşturalım ve işlemin ne kadar süreceğini test edelim.
1 2 3 4 5 |
CREATE DATABASE [DB20GB] ON PRIMARY (NAME = N'DB20GB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\DB20GB.mdf', SIZE = 20GB , FILEGROWTH = 1GB ) LOG ON (NAME= N'DB20GB_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\DB20GB_log.ldf', SIZE = 256MB , FILEGROWTH = 256MB ) |
1 2 3 4 5 |
set statistics time on CREATE DATABASE [DB20GB] ON PRIMARY (NAME = N'DB20GB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\DB20GB.mdf', SIZE = 20GB , FILEGROWTH = 1GB ) LOG ON (NAME= N'DB20GB_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\DB20GB_log.ldf', SIZE = 256MB , FILEGROWTH = 256MB ) |
Şimdi 10 gb bir veritabanını restore edebilmek için ne kadar süre gerekecek ona bakalım. Instant File Initialization özelliğinin kapalı olduğu durumda testimize başlayalım.
1 2 3 4 |
RESTORE DATABASE [DB10GB_Restore] FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\DB10GB.bak' WITH FILE = 1, MOVE N'DB10GB' TO N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\DB10GB_Restore.mdf', MOVE N'DB10GB_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\DB10GB_Restore_log.ldf', NOUNLOAD, STATS = 5 |
1 2 3 4 5 |
SET STATISTICS TIME on RESTORE DATABASE [DB10GB_Restore] FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\DB10GB.bak' WITH FILE = 1, MOVE N'DB10GB' TO N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\DB10GB_Restore.mdf', MOVE N'DB10GB_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\DB10GB_Restore_log.ldf', NOUNLOAD, STATS = 5 |
Transparent Data Encryption (TDE) mevcut veritabanlarında IFI aktif olsa dahi performans artışı sağlamaz. TDE veritabanının başka bir sunucuya kopyalanmasını veya restore işlemini önlemek için kullanılır. Hangi veritabanlarında TDE mevcut görmek için aşağıdaki sorgu kullanılabilir.
1 2 3 4 5 6 7 8 9 10 11 |
SELECT db.name, db.is_encrypted, dm.encryption_state, dm.percent_complete, dm.key_algorithm, dm.key_length FROM sys.databases db LEFT OUTER JOIN sys.dm_database_encryption_keys dm ON db.database_id = dm.database_id; |
TDE özelliğini veritabanına uygulamak için aşağıdaki sorguyu çalıştırabilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
USE master; GO CREATE MASTER KEY ENCRYPTION BY PASSWORD='!Verit@b@ni.01'; GO CREATE CERTIFICATE TDECert WITH SUBJECT='DB_Encryption'; GO USE DB10GB GO CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256 ENCRYPTION BY SERVER CERTIFICATE TDECert; GO ALTER DATABASE DB10GB SET ENCRYPTION ON; GO |
İlk olarak TDE aktif durumda DB10GB veritabanını 20 GB olacak şekilde güncelleyelim. Yukarıda paylaştığımız 20 GB veritabanı oluşturma sorgusunda boyut kısmını 10 GB olarak değiştirip teste başlayabilirsiniz.
1 2 3 4 5 |
set statistics time on use [master] GO ALTER DATABASE [DB10GB] MODIFY FILE ( NAME = N'DB10GB' , SIZE = 20GB ) GO |

Peki bütün bu testler sonucunda IFI özelliğinin neden varsayılan olarak aktif olmadığını anlatmaya çalışalım. Güvenlik sebebiyle özelliğin aktif olması SQL Server tarafından bize bırakılmıştır. IFI özelliği kullanılırken disk alanı sıfırlanmaz demiştik böylece kullanılmayan veriler fiziksel olarak diskte kalabilir. Eğer bu disk sonradan başka bir kişi veya sistem tarafından kullanılırsa, bu verilere erişim sağlanabilir. Instant File Initialization aktif olması durumunda güvenlik önlemlerinin doğru bir şekilde uygulanması gerektiğini unutmayalım.
Bu yazımızda Instant File Initialization özelliğinin ne gibi farklılıklar oluşturabileceğini bazı testler üzerinden anlatmaya çalıştık. SQL Server kurulumunun best practice şeklinde tamamlanmasının ne kadar önemli olduğunu da kavramış olduk. Acil şekilde aksiyon alınması gereken durumlarda Instant File Initialization özelliği hayat kurtarıcı olabilir. Instant File Initialization özelliğinin, veritabanı dosyalarını boyutlandırırken veya oluştururken etkili olduğunu, ancak veritabanındaki verilerin silinmesi noktasında bir performans artışı sağlamayacağını da bilmeliyiz. Konuyla ilgili daha fazla bilgi için https://learn.microsoft.com/en-us/sql/relational-databases/databases/database-instant-file-initialization?view=sql-server-ver16 adresini ziyaret edebilirsiniz.
Enes Hocam bu değerli yazı için teşekkürler. Yakın zamanda kurulum sonrası IFI açılmadığı için Restore işlemlerinde normal zamanda bitmesi gerek zamandan daha uzun zamanda bitmişti.