計算列の移行Migrating Computed Columns

適用対象: ○SQL Server ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

計算列は、メモリ最適化テーブルではサポートされていません。Computed columns are not supported in memory-optimized tables. ただし、計算列をシミュレートすることはできます。However, you can simulate a computed column.

SQL Server 2017 (14.x)SQL Server 2017 (14.x) 以降、メモリ最適化テーブルとインデックスで計算列がサポートされています。Beginning with SQL Server 2017 (14.x)SQL Server 2017 (14.x), computed columns are supported in memory-optimized tables and indexes.

ディスク ベース テーブルをメモリ最適化テーブルに移行するときは、計算列を保存する必要性を検討してください。You should consider the need to persist your computed columns when you migrate your disk-based tables to memory-optimized tables. メモリ最適化テーブルおよびネイティブ コンパイル ストアド プロシージャのさまざまなパフォーマンス特性によって、保存の必要性がなくなる場合があります。The different performance characteristics of memory-optimized tables and natively compiled stored procedures may negate the need for persistence.

保存されない計算列Non-Persisted Computed Columns

保存されない計算列の効果をシミュレートするには、メモリ最適化テーブルのビューを作成します。To simulate the effects of a non-persisted computed column, create a view on the memory-optimized table. ビューを定義する SELECT ステートメントで、計算列の定義をビューに追加します。In the SELECT statement that defines the view, add the computed column definition into the view. ネイティブ コンパイル ストアド プロシージャ内を除き、計算列からの値を使用するクエリは、このビューから読み取る必要があります。Except in a natively compiled stored procedure, queries that use values from the computed column should read from the view. ネイティブ コンパイル ストアド プロシージャ内では、計算列の定義によって、SELECT、UPDATE、または DELETE ステートメントを更新する必要があります。Inside natively compiled stored procedures, you should update any select, update, or delete statement according to your computed column definition.

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

保存される計算列Persisted Computed Columns

保存される計算列の効果をシミュレートするには、テーブルに挿入するためのストアド プロシージャとテーブルを更新するためのストアド プロシージャを作成します。To simulate the effects of a persisted computed column, create a stored procedure for inserting into the table and another stored procedure for updating the table. テーブルに対する挿入または更新を行う場合、これらのストアド プロシージャを呼び出してそれぞれのタスクを実行します。When inserting or updating the table, invoke these stored procedures to perform these tasks. ストアド プロシージャ内では、元のディスク ベース テーブルでの計算列の定義のように、入力に従って算定フィールドの値を計算します。Inside the stored procedures, calculate the value for the computed field according to the inputs, much like how the computed column is defined on the original disk-based table. 次に、ストアド プロシージャ内では必要に応じて、テーブルに対する挿入を更新を実行します。Then, insert or update the table as needed inside the 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  

参照See Also

インメモリ OLTP への移行Migrating to In-Memory OLTP