Condividi tramite


Migrazione di colonne calcolate

Le colonne calcolate non sono supportate nelle tabelle ottimizzate per la memoria. È tuttavia possibile simulare una colonna calcolata.

Quando si esegue la migrazione delle tabelle basate su disco alle tabelle ottimizzate per la memoria, è necessario considerare la necessità di rendere persistenti le colonne calcolate. Le diverse caratteristiche delle prestazioni delle tabelle ottimizzate per la memoria e delle stored procedure compilate in modo nativo possono negare la necessità di persistenza.

Colonne calcolate non persistenti

Per simulare gli effetti di una colonna calcolata non persistente, creare una vista sulla tabella ottimizzata per la memoria. Nell'istruzione SELECT che definisce la vista, aggiungi la definizione della colonna calcolata nella vista. Ad eccezione di una stored procedure compilata in modo nativo, le query che usano valori della colonna calcolata devono essere lette dalla vista. All'interno di stored procedure compilate in modo nativo, dovresti aggiornare qualsiasi istruzione select, update o delete in base alla tua definizione di colonna calcolata.

-- 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  

Colonne calcolate persistenti

Per simulare gli effetti di una colonna calcolata persistente, crea una procedura memorizzata per inserire i dati nella tabella e un'altra per aggiornarli. Quando si inserisce o si aggiorna la tabella, richiamare queste procedure memorizzate per eseguire queste attività. All'interno delle stored procedure calcolare il valore per il campo calcolato in base agli input, in modo analogo al modo in cui la colonna calcolata viene definita nella tabella originale basata su disco. Quindi, inserire o aggiornare la tabella in base alle esigenze all'interno della stored procedure.

-- 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  

Vedere anche

Migrazione a OLTP in memoria