Alterando tabelas com otimização de memória

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do Azure

Alterações de esquema e índice em tabelas com otimização de memória podem ser executadas usando a instrução ALTER TABLE . Em SQL Server 2016 e Banco de Dados SQL do Azure ALTER TABLE operações em tabelas com otimização de memória são OFFLINE, o que significa que a tabela não está disponível para consulta enquanto a operação está em andamento. O aplicativo de banco de dados pode continuar em execução e qualquer operação que acessa a tabela será bloqueada até que o processo de alteração seja concluído. É possível combinar várias operações ADD, DROP ou ALTER em uma única ALTER TABLE instrução.

Importante

A Instância Gerenciada de SQL do Azure não dá suporte a tabelas com otimização de memória na camada de serviço Uso Geral.

ALTER TABLE

A ALTER TABLE sintaxe é usada para fazer alterações no esquema de tabela, bem como para adicionar, excluir e recompilar índices. Índices são considerados parte da definição de tabela:

  • A sintaxe ALTER TABLE ... O ADD/DROP/ALTER INDEX tem suporte apenas para tabelas com otimização de memória.

  • Sem usar uma instruçãoALTER TABLE, as instruções CREATE INDEXe DROP INDEXALTER INDEXPAD_INDEX não têm suporte para índices em tabelas com otimização de memória.

Os tipos de alteração a seguir têm suporte:

  • Alterando o número de buckets

  • Adicionando e removendo um índice

  • Alterando, adicionando e removendo uma coluna

  • Adicionando e removendo uma restrição

Para obter mais informações sobre ALTER TABLE a funcionalidade e a sintaxe completa, consulte ALTER TABLE (Transact-SQL)

Dependência vinculada ao esquema

Procedimentos armazenados compilados nativamente devem ser vinculados ao esquema, o que significa que têm uma dependência vinculada ao esquema das tabelas otimizadas para memória que acessam e das colunas às quais fazem referência. A dependência associada a esquema é uma relação entre duas entidades que impede que a entidade referenciada seja cancelada ou modificada de modo incompatível enquanto existir a entidade mencionada.

Por exemplo, se um procedimento armazenado compilado de modo nativo associado a esquema fizer referência a uma coluna c1 da tabela mytable, a coluna c1 não poderá ser removida. Da mesma forma, se houver um procedimento desse tipo com uma instrução INSERT sem lista de colunas (por exemplo, INSERT INTO dbo.mytable VALUES (...)), nenhuma coluna na tabela poderá ser descartada.

Registro em log em tabelas otimizadas para memória ALTER TABLE

Em uma tabela com otimização de memória, a maioria dos ALTER TABLE cenários agora é executada em paralelo e resulta em uma otimização de gravações no log de transações. A otimização é obtida apenas registrando as alterações de metadados no log de transações. No entanto, as operações a seguir ALTER TABLE são executadas com thread único e não são otimizadas para log.

Nesse caso, a operação de thread única registraria todo o conteúdo da tabela alterada no log de transações. A seguir, a lista das operações de thread único:

  • Alterar ou adicionar uma coluna para usar um tipo de objeto grande (LOB): nvarchar(max), varchar(max) ou varbinary(max).

  • Adicionar ou remover um índice COLUMNSTORE.

  • Quase tudo o que afeta uma coluna fora de linha.

    • Faz com que uma coluna em linha passe para fora de linha.
    • Fazer com que uma coluna fora de linha mova-se para dentro da linha.
    • Crie uma nova coluna fora de linha.
    • Exceção: o aumento de uma coluna já fora de linha é registrado de forma otimizada.

Exemplos

O exemplo a seguir altera o número de buckets de um índice de hash existente. Isso reconstrói o índice de hash com o novo número de buckets, enquanto outras propriedades do índice de hash permanecem as mesmas.

ALTER TABLE Sales.SalesOrderDetail_inmem
       ALTER INDEX imPK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID  
              REBUILD WITH (BUCKET_COUNT=67108864);  
GO

O exemplo a seguir adiciona uma coluna com uma restrição NOT NULL e com uma DEFAULT definição e usa WITH VALUES para fornecer valores para cada linha existente na tabela. Se WITH VALUES não for usado, cada linha terá o valor NULL na nova coluna.

ALTER TABLE Sales.SalesOrderDetail_inmem  
       ADD Comment NVARCHAR(100) NOT NULL DEFAULT N'' WITH VALUES;  
GO

O exemplo a seguir adiciona uma restrição de chave primária a uma coluna existente.

CREATE TABLE dbo.UserSession (
   SessionId int not null,
   UserId int not null,
   CreatedDate datetime2 not null,
   ShoppingCartId int,
   index ix_UserId nonclustered hash (UserId) with (bucket_count=400000)
)
WITH (MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_ONLY) ;  
GO  
  
ALTER TABLE dbo.UserSession  
       ADD CONSTRAINT PK_UserSession PRIMARY KEY NONCLUSTERED (SessionId);  
GO

O exemplo a seguir remove um índice.

ALTER TABLE Sales.SalesOrderDetail_inmem  
       DROP INDEX ix_ModifiedDate;  
GO

O exemplo a seguir adiciona um índice.

ALTER TABLE Sales.SalesOrderDetail_inmem  
       ADD INDEX ix_ModifiedDate (ModifiedDate);  
GO  

O exemplo a seguir adiciona várias colunas, com um índice e restrições.

ALTER TABLE Sales.SalesOrderDetail_inmem  
       ADD    CustomerID int NOT NULL DEFAULT -1 WITH VALUES,  
              ShipMethodID int NOT NULL DEFAULT -1 WITH VALUES,  
              INDEX ix_Customer (CustomerID);  
GO  

Confira também

Tabelas com otimização de memória