Изменение таблиц с оптимизацией для памятиAltering Memory-Optimized Tables

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure нетAzure Synapse Analytics (хранилище данных SQL) нетParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) 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 и базе данных SQL Azure операции 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. В одной инструкции ALTER TABLE можно сочетать несколько операций ADD, DROP или ALTER.It is possible to combine multiple ADD, DROP or ALTER operations in a single ALTER TABLE statement.

Важно!

Управляемый экземпляр Базы данных SQL не поддерживает оптимизированные для памяти таблицы на уровне обслуживания "Общего назначения".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.

  • Инструкции CREATE INDEX, DROP INDEX, ALTER INDEX и PAD_INDEX не будут работать с индексами в таблицах, оптимизированных для памяти, если не используется инструкция ALTER TABLE.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. Привязанная к схеме зависимость — это связь между двумя сущностями, которая не допускает удаления или несовместимого изменения упоминаемой сущности, пока существует ссылающаяся сущность.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.

Например, если скомпилированная в собственном коде и привязанная к схеме хранимая процедура ссылается на столбец c1 из таблицы mytable, столбец 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), varbinary(max) или varchar(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