Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: 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