Ändra Minnesoptimerade tabeller

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Schema- och indexändringar i minnesoptimerade tabeller kan utföras med hjälp av ALTER TABLE-instruktionen. I SQL Server 2016 och Azure SQL Database är ALTER TABLE-åtgärder i minnesoptimerade tabeller OFFLINE, vilket innebär att tabellen inte är tillgänglig för frågor medan åtgärden pågår. Databasprogrammet kan fortsätta att köras och alla åtgärder som kommer åt tabellen blockeras tills ändringsprocessen har slutförts. Det går att kombinera flera ADD-, DROP- eller ALTER-åtgärder i en enda ALTER TABLE-instruktion.

Viktigt!

Azure SQL Managed Instance stöder inte minnesoptimerade tabeller på tjänstnivån Generell användning.

ALTER TABELL

SYNTAXEN ALTER TABLE används för att göra ändringar i tabellschemat samt för att lägga till, ta bort och återskapa index. Index betraktas som en del av tabelldefinitionen:

  • Syntaxen ALTER TABLE ... ADD/DROP/ALTER INDEX stöds endast för minnesoptimerade tabeller.

  • Utan att använda en ALTER TABLE-instruktion stöds inte uttrycken CREATE INDEX, DROP INDEX, ALTER INDEX och PAD_INDEX för index i minnesoptimerade tabeller.

Följande typer av ändringar stöds:

  • Ändra antalet bucketar

  • Lägga till och ta bort ett index

  • Ändra, lägga till och ta bort en kolumn

  • Lägga till och ta bort en begränsning

Mer information om ALTER TABLE-funktioner och fullständig syntax finns i ALTER TABLE (Transact-SQL)

Schemabundet beroende

Internt kompilerade lagrade procedurer måste vara schemabundna, vilket innebär att de har ett schemabundet beroende av de minnesoptimerade tabeller som de kommer åt och de kolumner som de refererar till. Ett schemabundet beroende är en relation mellan två entiteter som förhindrar att den refererade entiteten tas bort eller ändras inkompatibiskt så länge referensentiteten finns.

Om till exempel en schemabunden inbyggt kompilerad lagrad procedur refererar till en kolumn c1 från tabell mytable, kan kolumn c1 inte tas bort. Om det finns en sådan procedur med en INSERT-instruktion utan kolumnlista (t.ex. INSERT INTO dbo.mytable VALUES (...)), kan ingen kolumn i tabellen tas bort.

Loggning av ALTER TABLE på minnesoptimerade tabeller

I en minnesoptimerad tabell körs de flesta ALTER TABLE-scenarier nu parallellt och resulterar i en optimering av skrivningar till transaktionsloggen. Optimeringen uppnås genom att endast logga metadataändringarna i transaktionsloggen. Följande ALTER TABLE-åtgärder körs i ett enda tråd och är inte optimerade för loggning.

Den enkeltrådade åtgärden i det här fallet skulle logga hela innehållet i den ändrade tabellen till transaktionsloggen. En lista över entrådade åtgärder följer:

  • Ändra eller lägg till en kolumn för att använda en stor objekttyp (LOB): nvarchar(max), varchar(max) eller varbinary(max).

  • Lägg till eller släpp ett COLUMNSTORE-index.

  • Nästan allt som påverkar en separat kolumn.

    • Orsaka att en kolumn på samma rad flyttas utanför raden.
    • Orsaka att en kolumn utanför raderna flyttas till rad.
    • Skapa en ny kolumn utanför rad.
    • Undantag: Att förlänga en redan utomstående kolumn loggas på ett optimerat sätt.

Examples

I följande exempel ändras bucketantalet för ett befintligt hash-index. Detta återskapar hash-indexet med det nya bucketantalet medan andra egenskaper för hash-indexet förblir desamma.

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

I följande exempel läggs en kolumn med villkoret NOT NULL och med en STANDARDdefinition, och MED VÄRDEN används för att ange värden för varje befintlig rad i tabellen. Om WITH VALUES inte används har varje rad värdet NULL i den nya kolumnen.

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

I följande exempel läggs en primärnyckelbegränsning till i en befintlig kolumn.

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

I följande exempel tar du bort ett index.

ALTER TABLE Sales.SalesOrderDetail_inmem  
       DROP INDEX ix_ModifiedDate;  
GO

I följande exempel läggs ett index till.

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

I följande exempel läggs flera kolumner till med ett index och begränsningar.

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  

Se även

Memory-Optimized tabeller