O SQL Server 2017 tem alguns novos procedimentos armazenados:
- sp_refresh_single_snapshot_view – parâmetro de entrada para @view_name nvarchar(261), @rgCode int
- sp_refresh_snapshot_views – parâmetro de entrada para @rgCode int
E novas entradas em sys.messages:
- 10149 – O índice que tem SNAPSHOT_MATERIALIZATION não pode ser criado na exibição '%.*ls' porque a definição da exibição contém tabelas com otimização de memória.
- 10642 – SNAPSHOT_MATERIALIZATION não pode ser definido para o índice '%.*ls' em '%.*ls' porque só é aplicável a índices em exibições.
- 10643 – SNAPSHOT_MATERIALIZATION não pode ser definido para '%.*ls' em '%.*ls' porque é aplicável apenas a índices clusterizados em exibições.
- 10648 – SNAPSHOT_MATERIALIZATION não pode ser definido para o índice particionado '%.*ls' em '%.*ls'.
- 10649 – O índice não clusterizado '%.*ls' não pode ser criado em '%.*ls' que tenha o índice clusterizado '%.*ls' com SNAPSHOT_MATERIALIZATION.
- 10650 – A atualização de visualizações de instantâneos requer que o isolamento de instantâneos seja habilitado no banco de dados.
- 3760 – Não é possível descartar o índice '%.*ls' na exibição '%.*ls' que possui SNAPSHOT_MATERIALIZATION.
- 4524 – Não é possível alterar a visualização '%.*ls' porque possui materialização de instantâneo.
- 4525 – Não é possível usar a dica '%ls' na exibição '%.*ls' que tem materialização de instantâneo antes que a exibição seja atualizada.
E novos Eventos Estendidos:
Então, como podemos criar uma visão materializada por instantâneo? (A Microsoft ainda não documentou isso, obviamente.) Aqui está um resumo das coisas que tentei até agora que não funcionaram.
Você não pode. O recurso está desabilitado em 2017 RTM.
Dito isso, você pode...
Usando AdventureWorks:
As alterações nas tabelas subjacentes não são refletidas imediatamente na exibição (como normalmente é o caso do SQL Server). Da mesma forma, as modificações de dados nas tabelas subjacentes não precisam manter a exibição indexada do instantâneo.
Para atualizar o conteúdo da visualização, é necessário chamar um dos novos procedimentos armazenados:
Isso produz o plano de execução:
Isso provavelmente não funcionará para você, porque um sinalizador de rastreamento não documentado é necessário ou você precisa fazer a coisa particularmente desagradável que fiz: gravar no local da memória que contém o sinalizador de recurso (usando um depurador) para habilitar esse recurso.
Se você estiver curioso, o sinalizador de recurso é o byte em
sqllang!g_featureSwitchesLangSvc+0x10f
. É verificado durantesqllang!SpRefreshSingleSnapshotView
.Se você quiser jogar junto e estiver totalmente preparado para aceitar as consequências de hackear o código do SQL Server enquanto ele estiver em execução e usar um recurso que a Microsoft acha que ainda não está pronto:
Defina um ponto de interrupção:
Retome o SQL Server usando o comando Go (
g
)sys.sp_refresh_single_snapshot_view
comando acimaQuando o ponto de interrupção for atingido, percorra até ver a linha de código:
O deslocamento pode ser diferente em outras construções, por exemplo, em 2017 RTM CU3 é
sqllang!g_featureSwitchesLangSvc+0x114
O endereço de memória dentro dos parênteses pode ser diferente. Use o que você vê.
Use o comando display memory para ver o valor atual no endereço de memória que você encontrou:
Isso deve mostrar um zero, indicando que o recurso está desabilitado.
Altere o zero para um, usando o comando enter values (novamente com seu endereço de memória):
Desabilite o ponto de interrupção e retome a execução do SQL Server.
Note
SNAPSHOT_MATERIALIZATION
nos permite materializar um instantâneo de uma especificação de consulta que normalmente não poderia ser indexada, por exemplo, o abaixo usaMAX
:Resultado: