O database snapshot  possibilita a criação de uma “Foto” de um banco de dados em read-only.

Durante a criação dessa “foto” do banco de dados, todas as transações que não foram "comitadas" são desconsideradas, isso ocorre porque o SQL Server não pode garantir a consistência e integridade dos dados. Se por acaso a base de dados que conter uma “Foto” tiver problemas e por algum motivo ficar offline, o banco de dados de origem também ficará, isso ocorre porque o database snapshot faz referência aos arquivos físicos do banco de dados de origem.

O database snapshot opera em data-page level, ou seja, antes da página ser modificada na origem, a mesma é copiada para a “Foto”, essa operação é chamada de copy-on-write ou seja na criação do database snapshot temos ponteiros direcionando para as página no banco de dados de origem, quando essa página são alteradas, a página é transferida para a “Foto”. Para o armazenamento das páginas originais é utilizado sparse files

Quando há leitura de dados requisitada à partir do database snapshot, esta leitura ocorre pelo acesso no banco de dados origem para as páginas que ainda não foram copiadas para a “Foto” ou seja para as páginas que ainda não foram copiadas para o snapshot, há nele um ponteiro para a página no banco de dados origem, por isso que podemos também ter alguns problemas de I/O, isso ocorre porque à base terá diversos ponteiros para saber aonde se encontra a página que foi requisitada, sendo assim a requisição poderá ficar prejudicada.

Quando temos a página que foi solicitada para leitura dentro do snapshot, não é necessário voltar ao banco de dados origem, porque a página está alocada no sparse file. Depois de diversas inserções, o sparse file deve crescer até, aproximadamente, o tamanho do banco de dados de origem.



Abaixo, segue um exemplo de criação de um database snapshot 

--Criação de um Database Snapshot para o banco de dados "DB"
CREATE DATABASE [DB_Snapshot] ON
(
      NAME=[DB_Data],
      FILENAME=N’C:\temp\DB_DataSnapshot.mdf’
),
(
      NAME=[DB_FLG],
      FILENAME=N’C:\temp\DB_DataSnapshot.ndf’
)
AS SNAPSHOT OF [DB];