Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Azure SQL-Datenbank
Azure SQL Managed Instance
Schema- und Indexänderungen für speicheroptimierte Tabellen können mithilfe der ALTER TABLE Anweisung ausgeführt werden. In SQL Server 2016 und Azure SQL-Datenbank ALTER TABLE Vorgänge in speicheroptimierten Tabellen sind OFFLINE, was bedeutet, dass die Tabelle nicht für die Abfrage verfügbar ist, während der Vorgang ausgeführt wird. Die Datenbankanwendung kann weiterhin ausgeführt werden, und jeder Vorgang, der auf die Tabellen zugreift, wird blockiert bis der Änderungsprozess abgeschlossen ist. Es ist möglich, mehrere ADD-, DROP- oder ALTER-Vorgänge in einer einzelnen ALTER TABLE Anweisung zu kombinieren.
Wichtig
Azure SQL Managed Instance unterstützt keine speicheroptimierten Tabellen in der Dienstebene „Universell“.
ALTER TABLE
Die ALTER TABLE Syntax wird zum Vornehmen von Änderungen am Tabellenschema sowie zum Hinzufügen, Löschen und Neuerstellen von Indizes verwendet. Indizes werden als Teil der Tabellendefinition berücksichtigt:
Die Syntax ALTER TABLE ... ADD/DROP/ALTER INDEX wird nur für speicheroptimierte Tabellen unterstützt.
Ohne Verwendung einer ALTER TABLE Anweisung werden die Anweisungen CREATE INDEX, , DROP INDEX, ALTER INDEXund PAD_INDEX für Indizes für speicheroptimierte Tabellen nicht unterstützt.
Die folgenden Änderungen werden unterstützt:
Ändern der Bucket-Anzahl
Hinzufügen und Entfernen eines Indexes
Ändern, Hinzufügen und Entfernen einer Spalte
Hinzufügen und Entfernen einer Einschränkung
Weitere Informationen zur ALTER TABLE Funktionalität und zur vollständigen Syntax finden Sie unter ALTER TABLE (Transact-SQL)
Schemagebundene Abhängigkeit
Systemintern kompilierte gespeicherte Prozeduren müssen schemagebunden sein, d. h., sie haben eine schemagebundene Abhängigkeit zu den speicheroptimierten Tabellen, auf die sie zugreifen, und zu den Spalten, auf die sie verweisen. Eine schemagebundene Abhängigkeit ist eine Beziehung zwischen zwei Entitäten, mit der verhindert wird, dass die Entität, auf die verwiesen wird, gelöscht oder in einer inkompatiblen Art geändert wird, solange die verweisende Entität vorhanden ist.
Wird beispielsweise in einer schemagebundenen systemintern kompilierten gespeicherten Prozedur auf die Spalte c1 aus der Tabelle mytableverwiesen, kann die Spalte c1 nicht gelöscht werden. Ebenso kann, wenn es eine solche Prozedur mit einer INSERT-Anweisung ohne Spaltenliste gibt (z. B. INSERT INTO dbo.mytable VALUES (...)), keine Spalte in der Tabelle entfernt werden.
Protokollierung von ALTER TABLE auf speicheroptimierten Tabellen
In einer speicheroptimierten Tabelle werden die meisten ALTER TABLE Szenarien jetzt parallel ausgeführt und führen zu einer Optimierung von Schreibvorgängen in das Transaktionsprotokoll. Zur Optimierung werden nur die Metadatenänderungen in das Transaktionsprotokoll geschrieben. Die folgenden ALTER TABLE Vorgänge werden jedoch einzelthreadig ausgeführt und sind nicht für die Protokollierung optimiert.
Der Single-Thread-Betrieb würde in diesem Fall den gesamten Inhalt der geänderten Tabelle im Transaktionsprotokoll protokollieren. Im Folgenden finden Sie eine Liste der Singlethread-Vorgänge:
Ändern oder Hinzufügen einer Spalte, um einen LOB-Typ (Large Object) zu verwenden: nvarchar(max), varchar(max) oder varbinary(max).
Hinzufügen oder Löschen eines Columnstore-Indexes.
Nahezu alles, was sich auf eine Spalte außerhalb der Zeile auswirkt.
- Sorgen Sie dafür, dass eine Spalte in der Zeile aus der Zeile verschoben wird.
- Sorgen Sie dafür, dass eine Spalte außerhalb der Zeile in die Zeile verschoben wird.
- Erstellen Sie eine neue Spalte außerhalb der Zeile.
- Ausnahme: Das Verlängern einer Spalte außerhalb der Zeile wird auf optimierte Weise protokolliert.
Beispiele
Im folgenden Beispiel ändert sich die Bucketanzahl eines vorhandenen Hashindexes. Dadurch wird der Hashindex mit der neuen Bucketanzahl neu erstellt, während andere Eigenschaften des Hashindexes unverändert bleiben.
ALTER TABLE Sales.SalesOrderDetail_inmem
ALTER INDEX imPK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID
REBUILD WITH (BUCKET_COUNT=67108864);
GO
Im folgenden Beispiel wird eine Spalte mit einer NOT NULL-Einschränkung und einer DEFAULT Definition hinzugefügt und WITH VALUES verwendet, um Werte für jede vorhandene Zeile in der Tabelle bereitzustellen. Ohne WITH VALUES hat jede Zeile in der neuen Spalte den Wert NULL.
ALTER TABLE Sales.SalesOrderDetail_inmem
ADD Comment NVARCHAR(100) NOT NULL DEFAULT N'' WITH VALUES;
GO
Im folgenden Beispiel wird einer vorhandenen Spalte eine Primärschlüsseleinschränkung hinzugefügt.
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
Im folgenden Beispiel wird ein Index entfernt.
ALTER TABLE Sales.SalesOrderDetail_inmem
DROP INDEX ix_ModifiedDate;
GO
Im folgenden Beispiel wird ein Index hinzugefügt.
ALTER TABLE Sales.SalesOrderDetail_inmem
ADD INDEX ix_ModifiedDate (ModifiedDate);
GO
Im folgenden Beispiel werden mehrere Spalten hinzugefügt, mit einem Index und Einschränkungen.
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