Modificar tablas con optimización para memoriaAltering Memory-Optimized Tables

SE APLICA A: síSQL Server síAzure SQL Database noAzure Synapse Analytics (SQL DW) noAlmacenamiento de datos paralelosAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Los cambios de esquema y de índice en las tablas optimizadas para memoria pueden realizarse mediante la instrucción ALTER TABLE.Schema and index changes on memory-optimized tables can be performed by using the ALTER TABLE statement. En SQL Server 2016 y Azure SQL Database, las operaciones ALTER TABLE en tablas optimizadas para memoria son sin conexión, lo que significa que la tabla no está disponible para realizar consultas mientras la operación está en curso.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. La aplicación de base de datos puede seguir ejecutándose, y cualquier operación que tenga acceso a la tabla se bloqueará hasta que se complete el proceso de modificación.The database application can continue to run, and any operation that is accessing the table is blocked until the alteration process is completed. Es posible combinar varias operaciones ADD, DROP o ALTER en una sola instrucción ALTER TABLE.It is possible to combine multiple ADD, DROP or ALTER operations in a single ALTER TABLE statement.

Importante

La Instancia administrada de Azure SQL Database no admite tablas optimizadas para memoria en el nivel de servicio de uso general.Azure SQL Database Managed Instance does not support memory-optimized tables in the General Purpose service tier.

ALTER TABLEALTER TABLE

La sintaxis ALTER TABLE se usa para realizar cambios en el esquema de la tabla, así como para agregar, eliminar y volver a generar índices.The ALTER TABLE syntax is used for making changes to the table schema, as well as for adding, deleting, and rebuilding indexes. Los índices se consideran parte de la definición de tabla:Indexes are considered part of the table definition:

  • La sintaxis ALTER TABLE ... ADD/DROP/ALTER INDEX solo se admite para tablas optimizadas para memoria.The syntax ALTER TABLE ... ADD/DROP/ALTER INDEX is supported only for memory-optimized tables.

  • Si no se usa una instrucción ALTER TABLE, las instrucciones CREATE INDEX, DROP INDEX, ALTER INDEX y PAD_INDEX no son compatibles con los índices de las tablas optimizadas para memoria.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.

Se admiten los siguientes tipos de modificaciones:The following types of alterations are supported:

  • Cambiar el número de cubosChanging the bucket count

  • Agregar y quitar un índiceAdding and removing an index

  • Cambiar, agregar y quitar una columnaChanging, adding and removing a column

  • Agregar y quitar una restricciónAdding and removing a constraint

Para obtener más información sobre la funcionalidad ALTER TABLE y la sintaxis completa, vea ALTER TABLE (Transact-SQL).For more information on ALTER TABLE functionality and the complete syntax, see ALTER TABLE (Transact-SQL)

Dependencia enlazada a esquemaSchema-bound Dependency

Es necesario que los procedimientos almacenados compilados de forma nativa estén enlazados a un esquema, es decir, que tengan una dependencia enlazada a esquema en las tablas con optimización para memoria a las que acceden y las columnas a las que hacen referencia.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. Una dependencia enlazada a esquema es una relación entre dos entidades que evita que la entidad a la que se hace referencia se elimine o se modifique de manera incompatible mientras exista la entidad de referencia.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.

Por ejemplo, si un procedimiento almacenado compilado de forma nativa enlazado a esquema hace referencia a una columna c1 de la tabla mytable, la columna c1 no se puede quitar.For example, if a schema-bound natively compiled stored procedure references a column c1 from table mytable, column c1 cannot be dropped. Igualmente, si hay un procedimiento así con una instrucción INSERT sin lista de columnas (por ejemplo, INSERT INTO dbo.mytable VALUES (...)), no se puede quitar ninguna columna de la tabla.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.

Registro de ALTER TABLE en tablas optimizadas para memoriaLogging of ALTER TABLE on memory-optimized tables

En una tabla optimizada para memoria, la mayoría de los escenarios ALTER TABLE ahora se ejecutan en paralelo y generan una optimización de las escrituras en el registro de transacciones.On a memory-optimized table, most ALTER TABLE scenarios now run in parallel and result in an optimization of writes to the transaction log. La optimización se consigue únicamente al registrar los cambios de metadatos en el registro de transacciones.The optimization is achieved by only logging the metadata changes to the transaction log. Sin embargo, las siguientes operaciones de ALTER TABLE se ejecutan en un solo subproceso y no tienen optimización para registro.However, the following ALTER TABLE operations run single-threaded and are not log-optimized.

En este caso, la operación de un solo subproceso registraría todo el contenido de la tabla modificada en el registro de transacciones.The single-threaded operation in this case would log the entire content of the altered table to the transaction log. La siguiente es una lista de las operaciones de un solo subproceso:A list of single-threaded operations follows:

  • Modificar o agregar una columna para usar un objeto de gran tamaño (LOB): nvarchar(max), varchar(max) o varbinary(max).Alter or add a column to use a large object (LOB) type: nvarchar(max), varchar(max), or varbinary(max).

  • Agregar o quitar un índice COLUMNSTORE.Add or drop a COLUMNSTORE index.

  • Casi todo lo que afecta a una columna no consecutiva.Almost anything that affects an off-row column.

    • Hacer que una columna consecutiva pase a ser no consecutiva.Cause an on-row column to move off-row.
    • Hacer que una columna no consecutiva pase a ser consecutiva.Cause an off-row column to move on-row.
    • Crear una columna no consecutiva nueva.Create a new off-row column.
    • Excepción: el alargamiento de una columna que ya no es consecutiva se registra de la forma optimizada.Exception: Lengthening an already off-row column is logged in the optimized way.

EjemplosExamples

En el ejemplo siguiente se modifica el número de cubos de un índice de hash existente.The following example alters the bucket count of an existing hash index. Esto vuelve a generar el índice de hash con el nuevo número de cubos, mientras que las demás propiedades del índice de hash permanecen iguales.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

En el ejemplo siguiente se agrega una columna con una restricción NOT NULL y una definición DEFAULT, y se usa WITH VALUES para proporcionar valores para cada fila existente en la tabla.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. Si no se utiliza WITH VALUES, cada fila tiene el valor NULL en la nueva columna.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

En el ejemplo siguiente se agrega una restricción de clave principal a una columna existente.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

En el siguiente ejemplo se quita un índice.The following example removes an index.

ALTER TABLE Sales.SalesOrderDetail_inmem  
       DROP INDEX ix_ModifiedDate;  
GO

En el siguiente ejemplo se agrega un índice.The following example adds an index.

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

En el siguiente ejemplo se agregan varias columnas, con un índice y restricciones.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  

Consulte tambiénSee Also

Tablas optimizadas para la memoriaMemory-Optimized Tables