Partilhar via


Migrando colunas computadas

Não há suporte para colunas computadas em tabelas com otimização de memória. No entanto, você pode simular uma coluna computada.

Você deve considerar a necessidade de persistir suas colunas computadas ao migrar suas tabelas baseadas em disco para tabelas com otimização de memória. As diferentes características de desempenho de tabelas com otimização de memória e procedimentos armazenados compilados nativamente podem negar a necessidade de persistência.

Colunas computadas não persistentes

Para simular os efeitos de uma coluna computada não persistente, crie uma exibição na tabela com otimização de memória. Na instrução SELECT que define a exibição, adicione a definição de coluna computada à exibição. Exceto em um procedimento armazenado compilado nativamente, as consultas que usam valores da coluna computada devem ser lidas do modo de exibição. Dentro de procedimentos armazenados compilados nativamente, você deve atualizar qualquer instrução de seleção, atualização ou exclusão conforme a definição da coluna calculada.

-- Schema for the table dbo.OrderDetails:  
-- OrderId int not null primary key,  
-- ProductId int not null,  
-- SalePrice money not null,  
-- Quantity int not null,  
-- Total money not null  
--  
-- Total is computed as SalePrice * Quantity and is not persisted.  
CREATE VIEW dbo.v_order_details AS  
   SELECT  
      OrderId,  
      ProductId,  
      SalePrice,  
      Quantity,  
      Quantity * SalePrice AS Total  
   FROM dbo.order_details  

Colunas computadas persistentes

Para simular os efeitos de uma coluna computada persistente, crie um procedimento armazenado para inserir na tabela e outro procedimento armazenado para atualizar a tabela. Ao inserir ou atualizar a tabela, invoque esses procedimentos armazenados para executar essas tarefas. Dentro dos procedimentos armazenados, calcule o valor do campo computado de acordo com as entradas, assim como a coluna computada é definida na tabela original baseada em disco. Em seguida, insira ou atualize a tabela conforme necessário dentro do procedimento armazenado.

-- Schema for the table dbo.OrderDetails:  
-- OrderId int not null primary key,  
-- ProductId int not null,  
-- SalePrice money not null,  
-- Quantity int not null,  
-- Total money not null  
--  
-- Total is computed as SalePrice * Quantity and is persisted.  
-- we need to create insert and update procedures to calculate Total.  
CREATE PROCEDURE sp_insert_order_details   
@OrderId int, @ProductId int, @SalePrice money, @Quantity int  
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER  
AS BEGIN ATOMIC WITH (LANGUAGE = N'english', TRANSACTION ISOLATION LEVEL = SNAPSHOT)  
-- compute the value here.   
-- this stored procedure works with single rows only.  
-- for bulk inserts, accept a table-valued parameter into the stored procedure  
-- and use an INSERT INTO SELECT statement.  
DECLARE @total money = @SalePrice * @Quantity  
INSERT INTO dbo.OrderDetails (OrderId, ProductId, SalePrice, Quantity, Total)  
VALUES (@OrderId, @ProductId, @SalePrice, @Quantity, @total)  
END  
GO  
  
CREATE PROCEDURE sp_update_order_details_by_id  
@OrderId int, @ProductId int, @SalePrice money, @Quantity int  
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER  
AS BEGIN ATOMIC WITH (LANGUAGE = N'english', TRANSACTION ISOLATION LEVEL = SNAPSHOT)  
-- compute the value here.   
-- this stored procedure works with single rows only.  
DECLARE @total money = @SalePrice * @Quantity  
UPDATE dbo.OrderDetails   
SET ProductId = @ProductId, SalePrice = @SalePrice, Quantity = @Quantity, Total = @total  
WHERE OrderId = @OrderId  
END  
GO  

Consulte Também

Migrando para In-Memory OLTP