メモリ最適化テーブルの変更Altering Memory-Optimized Tables

適用対象: ○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

メモリ最適化テーブルのスキーマとインデックスの変更は、ALTER TABLE ステートメントを使用して実行できます。Schema and index changes on memory-optimized tables can be performed by using the ALTER TABLE statement. SQL Server 2016 と Azure SQL Database では、メモリ最適化テーブルに対する ALTER TABLE 操作は OFFLINE です。つまり、操作が行われている間、テーブルのクエリを行うことはできません。In SQL Server 2016 and Azure SQL Database ALTER TABLE operations on memory-optimized tables are OFFLINE, meaning that the table is not available for querying while the operation is in progress. データベース アプリケーションは実行を継続できます。また、テーブルにアクセスする操作は、変更プロセスが完了するまでブロックされます。The database application can continue to run, and any operation that is accessing the table is blocked until the alteration process is completed. 1 つの ALTER TABLE ステートメントに、複数の ADD、DROP、または ALTER 操作を組み合わせることができます。It is possible to combine multiple ADD, DROP or ALTER operations in a single ALTER TABLE statement.

重要

Azure SQL Database Managed Instance では、General Purpose サービス層でのメモリ最適化テーブルはサポートされません。Azure SQL Database Managed Instance does not support memory-optimized tables in the General Purpose service tier.

ALTER TABLEALTER TABLE

ALTER TABLE 構文は、テーブル スキーマを変更する場合だけでなく、インデックスの追加、削除、および再構築の場合にも使用します。The ALTER TABLE syntax is used for making changes to the table schema, as well as for adding, deleting, and rebuilding indexes. インデックスは、テーブル定義の一部と見なされます。Indexes are considered part of the table definition:

  • 構文 ALTER TABLE ...ADD/DROP/ALTER INDEX は、メモリ最適化テーブルでのみサポートされます。The syntax ALTER TABLE ... ADD/DROP/ALTER INDEX is supported only for memory-optimized tables.

  • ALTER TABLE ステートメントを使用しない場合、メモリ最適化テーブルのインデックスに対してステートメント CREATE INDEXDROP INDEXALTER INDEXPAD_INDEX を使用することはできません。Without using an ALTER TABLE statement, the statements CREATE INDEX, DROP INDEX, ALTER INDEX, and PAD_INDEX are not supported for indexes on memory-optimized tables.

次の種類の変更がサポートされています。The following types of alterations are supported:

  • バケット数の変更Changing the bucket count

  • インデックスの追加と削除Adding and removing an index

  • 列の変更、追加、削除Changing, adding and removing a column

  • 定数の追加と削除Adding and removing a constraint

ALTER TABLE の機能と詳細な構文については、「ALTER TABLE (Transact-SQL)」を参照してください。For more information on ALTER TABLE functionality and the complete syntax, see ALTER TABLE (Transact-SQL)

スキーマ バインド依存関係Schema-bound Dependency

スキーマ バインドであるためには、アクセスするメモリ最適化テーブルおよび参照する列に対するスキーマ バインド依存関係を持つネイティブ コンパイル ストアド プロシージャが必要です。Natively compiled stored procedures are required to be schema-bound, meaning they have a schema-bound dependency on the memory optimized tables they access, and the columns they reference. スキーマ バインド依存関係とは、参照元エンティティが存在する限り、参照先エンティティを削除したり、互換性のない方法で変更したりすることができない 2 つのエンティティ間のリレーションシップです。A schema-bound dependency is a relationship between two entities that prevents the referenced entity from being dropped or incompatibly modified as long as the referencing entity exists.

たとえば、スキーマ バインドのネイティブ コンパイル ストアド プロシージャがテーブル mytable の列 c1を参照している場合、列 c1 は削除できません。For example, if a schema-bound natively compiled stored procedure references a column c1 from table mytable, column c1 cannot be dropped. 同様に、このようなプロシージャで列リストのない INSERT ステートメント (たとえば INSERT INTO dbo.mytable VALUES (...)) を使用している場合、テーブルの列はどれも削除できません。Similarly, if there is such a procedure with an INSERT statement without column list (e.g., INSERT INTO dbo.mytable VALUES (...)), then no column in the table can be dropped.

メモリ最適化テーブルの ALTER TABLE のログ記録Logging of ALTER TABLE on memory-optimized tables

メモリ最適化テーブルでは、ほとんどの ALTER TABLE シナリオが並列に実行され、トランザクション ログへの書き込みが最適化されるようになりました。On a memory-optimized table, most ALTER TABLE scenarios now run in parallel and result in an optimization of writes to the transaction log. 最適化は、メタデータの変更のみをトランザクション ログに記録することによって実現されます。The optimization is achieved by only logging the metadata changes to the transaction log. ただし、次の ALTER TABLE 操作ではシングル スレッドが実行され、ログ最適化は行われません。However, the following ALTER TABLE operations run single-threaded and are not log-optimized.

この場合のシングル スレッド操作は、変更されたテーブルの内容全体をトランザクション ログに記録します。The single-threaded operation in this case would log the entire content of the altered table to the transaction log. シングル スレッド操作の一覧を以下に示します。A list of single-threaded operations follows:

  • nvarchar(max)、varchar(max)、varbinary(max) などのラージ オブジェクト (LOB) 型を使用するために列を変更または追加します。Alter or add a column to use a large object (LOB) type: nvarchar(max), varchar(max), or varbinary(max).

  • COLUMNSTORE インデックスを追加または削除します。Add or drop a COLUMNSTORE index.

  • 行外列に影響するほぼあらゆる操作。Almost anything that affects an off-row column.

    • 行内の列を行外に移動します。Cause an on-row column to move off-row.
    • 行外の列を行内に移動します。Cause an off-row column to move on-row.
    • 新しい行外の列を作成します。Create a new off-row column.
    • 例外: 既存の行外列が長くなった場合は、最適化された方法でログに記録されます。Exception: Lengthening an already off-row column is logged in the optimized way.

使用例Examples

次の例では、既存のハッシュ インデックスのバケット数を変更します。The following example alters the bucket count of an existing hash index. その結果、新しいバケット数でハッシュ インデックスが再構築されますが、ハッシュ インデックスの他のプロパティは変わりません。This rebuilds the hash index with the new bucket count while other properties of the hash index remain the same.

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

次の例では、NOT NULL 制約と DEFAULT 定義を指定した列を追加し、WITH VALUES を使用して、テーブルに存在する各行の値を指定します。The following example adds a column with a NOT NULL constraint and with a DEFAULT definition, and uses WITH VALUES to provide values for each existing row in the table. WITH VALUES を使用しない場合、新しい列には NULL 値が格納されます。If WITH VALUES is not used, each row has the value NULL in the new column.

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

次の例では、プライマリ キー制約を既存の列に追加します。The following example adds a primary key constraint to an existing column.

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

次の例では、インデックスを削除します。The following example removes an index.

ALTER TABLE Sales.SalesOrderDetail_inmem  
       DROP INDEX ix_ModifiedDate;  
GO

次の例では、インデックスを追加します。The following example adds an index.

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

次の例では、インデックスと制約が指定された複数の列を追加します。The following example adds multiple columns, with an index and constraints.

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  

参照See Also

メモリ最適化テーブルMemory-Optimized Tables