Modifica di tabelle con ottimizzazione per la memoriaAltering Memory-Optimized Tables

QUESTO ARGOMENTO SI APPLICA A: sìSQL Server (a partire dalla versione 2016)sìDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Le modifiche dello schema e dell'indice nelle tabelle con ottimizzazione per la memoria possono essere eseguite con l'istruzione ALTER TABLE.Schema and index changes on memory-optimized tables can be performed by using the ALTER TABLE statement. In SQL Server 2016 e nel database SQL di Azure le operazioni ALTER TABLE su tabelle ottimizzate per la memoria sono OFFLINE, vale a dire che la tabella non è disponibile per eseguire una query mentre è in corso l'operazione.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. L'applicazione di database può proseguire l'esecuzione e qualsiasi operazione che accede alla tabella viene bloccata fino al termine del processo di modifica.The database application can continue to run, and any operation that is accessing the table is blocked until the alteration process is completed. È possibile combinare più operazioni ADD, DROP o ALTER in una singola istruzione ALTER TABLE.It is possible to combine multiple ADD, DROP or ALTER operations in a single ALTER TABLE statement.

ALTER TABLEALTER TABLE

La sintassi ALTER TABLE viene usata per apportare modifiche allo schema della tabella e per aggiungere, eliminare e ricompilare gli indici.The ALTER TABLE syntax is used for making changes to the table schema, as well as for adding, deleting, and rebuilding indexes. Gli indici sono considerati parte della definizione di tabella:Indexes are considered part of the table definition:

  • La sintassi ALTER TABLE …The syntax ALTER TABLE … ADD/DROP/ALTER INDEX è supportata solo per le tabelle con ottimizzazione per la memoria.ADD/DROP/ALTER INDEX is supported only for memory-optimized tables.

  • Se non si usa l'istruzione ALTER TABLE, le istruzioni CREATE INDEX, DROP INDEX e ALTER INDEX non sono supportate per gli indici nelle tabelle con ottimizzazione per la memoria.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.

    Di seguito è riportata la sintassi per le clausole ADD, DROP e ALTER INDEX nell'istruzione ALTER TABLE.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> )     
     }  
}  

Sono supportati i tipi di modifiche seguenti:The following types of alterations are supported.

  • Modifica del numero di bucketChanging the bucket count

  • Aggiunta e rimozione di un indiceAdding and removing an index

  • Modifica, aggiunta e rimozione di una colonnaChanging, adding and removing a column

  • Aggiunta e rimozione di un vincoloAdding and removing a constraint

    Per altre informazioni sulla funzionalità ALTER TABLE e per la sintassi completa, vedere ALTER TABLE (Transact-SQL)For more information on ALTER TABLE functionality and the complete syntax, see ALTER TABLE (Transact-SQL)

Dipendenza associata a schemaSchema-bound Dependency

Le stored procedure compilate in modo nativo devono essere associate a schema, ovvero devono avere una dipendenza associata a schema rispetto alle tabelle con ottimizzazione per la memoria a cui accedono e alle colonne a cui fanno riferimento.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 dipendenza associata a schema è una relazione tra due entità che impedisce l'eliminazione o la modifica incompatibile dell'entità a cui si fa riferimento finché esiste l'entità di riferimento.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.

Ad esempio, se una stored procedure compilata in modo nativo con associazione a schema fa riferimento a una colonna c1 dalla tabella mytable, la colonna c1 non può essere eliminata.For example, if a schema-bound natively compiled stored procedure references a column c1 from table mytable, column c1 cannot be dropped. Analogamente, se esiste una procedura con un'istruzione INSERT senza elenco di colonne, ad esempio, INSERT INTO dbo.mytable VALUES (...), non è possibile eliminare alcuna colonna nella tabella.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.

Registrazione di ALTER TABLE nelle tabelle con ottimizzazione per la memoriaLogging of ALTER TABLE on memory-optimized tables

In una tabella con ottimizzazione per la memoria, la maggior parte degli scenari ALTER TABLE ora viene eseguita in parallelo, con conseguente ottimizzazione delle operazioni di scrittura nel log delle transazioni.On a memory-optimized table, most ALTER TABLE scenarios now run in parallel and result in an optimization of writes to the transaction log. L'ottimizzazione si ottiene registrando nel log delle transazioni solo le modifiche ai metadati.The optimization is achieved by only logging the metadata changes to the transaction log. Le operazioni ALTER TABLE seguenti vengono tuttavia eseguite a thread singolo e non sono ottimizzate per il log.However, the following ALTER TABLE operations run single-threaded and are not log-optimized.

In questo caso l'operazione a thread singolo registrerebbe l'intero contenuto della tabella modificata nel log delle transazioni.The single-threaded operation in this case would log the entire content of the altered table to the transaction log. Di seguito è riportato un elenco di operazioni a thread singolo:A list of single-threaded operations follows:

  • Modificare o aggiungere una colonna per usare un tipo LOB (Large Object): 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).

  • Aggiungere o eliminare un indice COLUMNSTORE.Add or drop a COLUMNSTORE index.

  • Quasi tutto ciò che interessa una colonna all'esterno di righe.Almost anything that affects an off-row column.

    • Spostare una colonna dall'interno di righe all'esterno di righe.Cause an on-row column to move off-row.

    • Spostare una colonna dall'esterno di righe all'interno di righe.Cause an off-row column to move on-row.

    • Creare una nuova colonna all'esterno di righe.Create a new off-row column.

    • Eccezione: il prolungamento di una colonna già all'esterno di righe viene registrato in modo ottimizzato.Exception: Lengthening an already off-row column is logged in the optimized way.

EsempiExamples

L'esempio seguente modifica il numero di bucket di un indice hash esistente.The following example alters the bucket count of an existing hash index. L'indice hash viene ricompilato con il nuovo numero di bucket mentre le altre proprietà dell'indice hash rimangono invariate.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

L'esempio seguente aggiunge una colonna con un vincolo NON NULL e una definizione DEFAULT e usa WITH VALUES per fornire valori per ogni riga esistente nella tabella.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. Se non si utilizza WITH VALUES, a ogni riga della nuova colonna viene associato il valore 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

L'esempio seguente aggiunge un vincolo di chiave primaria a una colonna esistente.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

L'esempio seguente rimuove un indice.The following example removes an index.

ALTER TABLE Sales.SalesOrderDetail_inmem  
       DROP INDEX ix_ModifiedDate;  
GO

L'esempio seguente aggiunge un indice.The following example adds an index.

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

L'esempio seguente aggiunge più colonne, con un indice e vincoli.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  

Vedere ancheSee Also

Tabelle con ottimizzazione per la memoriaMemory-Optimized Tables