메모리 액세스에 최적화된 테이블 변경Altering Memory-Optimized Tables

이 항목 적용 대상: 예SQL Server예Azure SQL 데이터베이스없습니다Azure SQL 데이터 웨어하우스 없습니다 병렬 데이터 웨어하우스THIS TOPIC APPLIES TO: yesSQL ServeryesAzure SQL DatabasenoAzure 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 작업은 오프라인이므로 작업이 진행되는 동안 테이블을 쿼리할 수 없습니다.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. 여러 ADD, DROP 또는 ALTER 작업을 단일 ALTER TABLE 문에 결합할 수 없습니다.It is possible to combine multiple ADD, DROP or ALTER operations in a single ALTER TABLE statement.

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 ...The syntax ALTER TABLE … ADD/DROP/ALTER INDEX 구문은 메모리 최적화 테이블에만 지원됩니다.ADD/DROP/ALTER INDEX is supported only for memory-optimized tables.

  • ALTER TABLE 문을 사용하지 않을 경우 CREATE INDEX, DROP INDEX, ALTER INDEX 문은 메모리 최적화 테이블의 인덱스로 지원되지 않습니다 .Without using an ALTER TABLE statement, the statements CREATE INDEX and DROP INDEX and ALTER INDEX are not supported for indexes on memory-optimized tables.

    다음은 ALTER TABLE 문의 ADD, DROP, ALTER INDEX 절의 구문입니다.The following is the syntax for the ADD and DROP and ALTER INDEX clauses on the ALTER TABLE statement.

| ADD   
     {   
        <column_definition>  
      | <table_constraint>  
      | <table_index>    
     } [ ,...n ]  

| DROP   
     {  
         [ CONSTRAINT ]   
         {   
              constraint_name   
         } [ ,...n ]  
         | COLUMN   
         {  
              column_name   
         } [ ,...n ]  
         | INDEX   
         {  
              index_name   
         } [ ,...n ]  
     } [ ,...n ]  

| ALTER INDEX index_name  
     {   
         REBUILD WITH ( <rebuild_index_option> )     
     }  
}  

다음과 같은 유형의 수정이 지원됩니다.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. 스키마 바운드 종속성은 참조 엔터티가 존재하는 한 참조된 엔터티가 삭제되거나 호환되지 않는 방식으로 수정되지 않도록 방지하는 두 엔터티 간 관계입니다.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:

  • 큰 개체(LOB) 형식인 nvarchar(max), varchar(max) 또는 varbinary(max)를 사용하도록 열을 변경하거나 추가합니다.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