Partager via


Migration de colonnes calculées

Les colonnes calculées ne sont pas prises en charge dans les tables mémoire optimisées. Toutefois, vous pouvez simuler une colonne calculée.

Vous devez tenir compte de la nécessité de conserver vos colonnes calculées lorsque vous migrez vos tables sur disque vers des tables mémoire optimisées. Les différentes caractéristiques de performances des tables optimisées en mémoire et des procédures stockées compilées en mode natif peuvent supprimer le besoin de persistance.

Colonnes calculées non persistantes

Pour simuler les effets d’une colonne calculée non persistante, créez une vue sur la table optimisée en mémoire. Dans l’instruction SELECT qui définit la vue, ajoutez la définition de colonne calculée dans la vue. À l’exception d’une procédure stockée compilée en mode natif, les requêtes qui utilisent des valeurs de la colonne calculée devraient être lues depuis la vue. Dans les procédures stockées compilées en mode natif, vous devez mettre à jour n’importe quelle instruction select, update ou delete en fonction de votre définition de colonne calculée.

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

Colonnes calculées persistantes

Pour simuler les effets d’une colonne calculée persistante, créez une procédure stockée pour l’insertion dans la table et une autre procédure stockée pour la mise à jour de la table. Lors de l’insertion ou de la mise à jour de la table, appelez ces procédures stockées pour effectuer ces tâches. Dans les procédures stockées, calculez la valeur du champ calculé en fonction des entrées, comme la façon dont la colonne calculée est définie sur la table sur disque d’origine. Ensuite, insérez ou mettez à jour si nécessaire la table dans la procédure stockée.

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

Voir aussi

Migration vers In-Memory OLTP