Изменение таблиц, оптимизированных для памяти

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Изменения схемы и индекса в таблицах, оптимизированных для памяти, можно выполнять с помощью инструкции ALTER TABLE . В SQL Server 2016 и База данных SQL Azure ALTER TABLE операции с оптимизированными для памяти таблицами находятся в автономном режиме, что означает, что таблица недоступна для запроса во время выполнения операции. Приложение базы данных может продолжать работу, и любая операция, которая обращается к таблице, будет блокироваться до завершения процесса изменения. Можно объединить несколько операций ADD, DROP или ALTER в одной ALTER TABLE инструкции.

Внимание

Управляемый экземпляр SQL Azure не поддерживает оптимизированные для памяти таблицы на уровне обслуживания "Общего назначения".

ALTER TABLE

Синтаксис ALTER TABLE используется для внесения изменений в схему таблицы, а также для добавления, удаления и перестроения индексов. Индексы являются частью определения таблицы:

  • Синтаксис ALTER TABLE ... ADD/DROP/ALTER INDEX поддерживается только для оптимизированных для памяти таблиц.

  • Без использования инструкции ALTER TABLE, инструкции CREATE INDEX, DROP INDEX, ALTER INDEX и PAD_INDEX не поддерживаются для индексов таблиц, оптимизированных для памяти.

Поддерживаются следующие типы изменений:

  • Изменение числа контейнеров

  • Добавление и удаление индекса

  • Изменение, добавление и удаление столбца

  • Добавление и удаление ограничения

Дополнительные сведения о ALTER TABLE функциональных возможностях и полном синтаксисе см. в разделе ALTER TABLE (Transact-SQL)

Зависимость, привязанная к схеме

Скомпилированные в собственном коде хранимые процедуры должны быть привязаны к схеме, а значит иметь привязанную к схеме зависимость от оптимизированных в памяти таблиц, к которым они обращаются, и столбцов, на которые они ссылаются. Привязанная к схеме зависимость — это связь между двумя сущностями, которая не допускает удаления или несовместимого изменения упоминаемой сущности, пока существует ссылающаяся сущность.

Например, если скомпилированная в собственном коде и привязанная к схеме хранимая процедура ссылается на столбец c1 из таблицы mytable, столбец c1 удалить нельзя. Аналогичным образом, если существует такая процедура с оператором INSERT без списка столбцов (например, INSERT INTO dbo.mytable VALUES (...)), столбец в таблице не может быть удален.

Ведение журнала в таблицах, оптимизированных для ALTER TABLE памяти

В оптимизированной для памяти таблице большинство ALTER TABLE сценариев выполняются параллельно и приводят к оптимизации операций записи в журнал транзакций. Оптимизация заключается в том, что только изменения метаданных записываются в журнал транзакций. Однако следующие операции ALTER TABLE выполняются в одном потоке и не оптимизированы для работы с журналом.

В этом случае однопотоковая операция записала бы в журнал транзакций все содержимое измененной таблицы. Далее приведен список операций, выполняемых в одном потоке:

  • Изменить или добавить столбец для использования типа данных больших объектов (LOB): nvarchar(max), varchar(max) или varbinary(max).

  • Добавьте или удалите индекс COLUMNSTORE.

  • Практически все, что влияет на столбец за пределами строки.

    • перемещение столбца в строке за пределы строки;
    • Переместите столбец из положения вне строки в строку.
    • Создайте новый столбец вне строки.
    • Исключение: удлинение столбца, который уже находится вне строки, фиксируется в журнале оптимизированным образом.

Примеры

В следующем примере изменяется число контейнеров существующего хэш-индекса. Это приводит к перестроению хэш-индекса с помощью нового числа контейнеров, при этом другие свойства хэш-индекса остаются неизменными.

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

В следующем примере добавляется столбец с ограничением NOT NULL и с определением DEFAULT, а предложение WITH VALUES используется для задания значений каждой существующей строки в таблице. Если аргумент WITH VALUES не используется, то каждая строка в новом столбце имеет значение NULL.

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

В следующем примере к существующему столбцу добавляется ограничение первичного ключа.

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

В следующем примере удаляется индекс.

ALTER TABLE Sales.SalesOrderDetail_inmem  
       DROP INDEX ix_ModifiedDate;  
GO

В следующем примере добавляется индекс.

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

В следующем примере добавляется несколько столбцов с индексом и ограничениями.

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  

См. также

Таблицы, оптимизированные для памяти