[Administração] SQL Server Instant File Initialization
Quando atribuimos a permissão de Perform Volume Maintenance Tasks para a conta que inicia o serviço do SQL Server (em Local Security Policies do Windows), permitimos que o SQL Server aloque espaço para arquivos de dados quase que instantaneamente; esse recurso é conhecido por "Instant File Initialization" (IFI).
Na prática isso facilita muito o processo de criação ou crescimento de arquivos de dados, restauração de backups, etc; mas o IFI não tem efeito em arquivos de log.
Muitos clientes perguntam o motivo do IFI tornar o processo de alocação de espaço tão rápido e o motivo é que, por padrão, quando o SQL Server precisa alocar espaço para um arquivo, ele preenche o novo espaço com zeros. Quanto maior é a alocação de espaço, mais zeros o SQL Server tem que escrever, portanto, maior a espera. Quando o IFI está habilitado o SQL Server não preenche o novo espaço com zeros e assim o processo é concluído quase que instantaneamente.
Para visualizar o comportamento do IFI podemos utilizar um pequeno disco e criar nele um grande arquivo .txt com algum conteúdo; no meu cenário, criei um arquivo com a frase "O Rato Roeu a Roupa do Rei de Roma" inúmeras vezes. Em seguida podemos apagar o .txt.
Se verificarmos o conteúdo do disco com um editor hexadecimal, veremos que apesar de termos apagado o arquivo .txt, o conteúdo do arquivo ainda está gravado lá:
Agora com o Instant File Initialization habilitado, criamos um banco SQL Server nesse disco. O editor hexadecimal mostrará (para espanto de muitos) que o novo .mdf parece estar preenchido com milhares de "O Rato Roeu a Roupa do Rei de Roma". Como o IFI estava habilitado o SQL Server não teve o trabalho extra de preencher o espaço alocado com zeros no novo .mdf, portanto os dados do antigo .txt não foram sobrescritos. Conforme o SQL Server começar a receber novos dados nesse banco, os dados antigos serão sobrescritos.
Se repetirmos o mesmo teste com o IFI desabilitado, veremos que a criação do banco demora mais e no editor hexadecimal veremos que o SQL Server preencheu com zeros o novo espaço alocado:
Pontos adicionais
- Após conceder a permissão Perform Volume Maintenance Tasks é necessário reiniciar o serviço do SQL Server;
- Para instâncias clusterizadas é preciso conceder essa permissão em todos os nós;
- No SQL Server 2016 é possível conceder essa permissão durante o setup:
Update em 06/10/2017
A partir do SQL Server 2016 SP1 e SQL Server 2012 SP4 é possível validar se o IFI está habilitado na instância consultando a DMV sys.dm_server_services. A DMV não considera se o serviço foi reiniciado.
Referências adicionais
Database Instant File Initialization: /en-us/sql/relational-databases/databases/database-instant-file-initialization
SetFileValidData function: https://msdn.microsoft.com/en-us/library/aa365544(VS.85).aspx
Silas
============================
The code and techniques described in this blog are presented to the reader ‘as is’, without any warranty, whether express or implied, of its accuracy, completeness, fitness for a particular purpose, title or non-infringement, and none of the third-party products or information mentioned in the work are authored, recommended, supported or guaranteed by any of the authors or Microsoft. Further, the authors shall not be liable for any damages you may sustain by using this information, whether direct, indirect, special, incidental or consequential, even if it has been advised of the possibility of such damages. Your use of the information contained in these pages, is at your sole risk.