Změna paměťově optimalizovaných tabulek

platí pro: SQL Server Azure SQL DatabaseAzure SQL Managed Instance

Změny schématu a indexu v tabulkách optimalizovaných pro paměť je možné provádět pomocí příkazu ALTER TABLE . V SQL Serveru 2016 a Azure SQL Database ALTER TABLE probíhají operace s paměťově optimalizovanými tabulkami offline, což znamená, že tabulka není v průběhu operace k dispozici pro dotazy. Databázová aplikace může pokračovat ve spuštění a všechny operace, které přistupují k tabulce, se zablokují, dokud se proces změny nedokončí. V jednom ALTER TABLE příkazu je možné kombinovat více operací ADD, DROP nebo ALTER.

Důležité

Spravovaná instance Azure SQL nepodporuje tabulky optimalizované pro paměť na úrovni služby Pro obecné účely.

ALTER TABLE

Syntaxe ALTER TABLE se používá k provádění změn schématu tabulky a také k přidávání, odstraňování a opětovnému sestavení indexů. Indexy jsou považovány za součást definice tabulky:

  • Syntaxe ALTER TABLE ... ADD/DROP/ALTER INDEX je podporován pouze pro tabulky optimalizované pro paměť.

  • Bez použití ALTER TABLE příkazu nejsou příkazy CREATE INDEX, , DROP INDEXALTER INDEXa PAD_INDEX podporovány pro indexy v tabulkách optimalizovaných pro paměť.

Podporují se následující typy změn:

  • Změna počtu kbelíků

  • Přidání a odebrání indexu

  • Změna, přidání a odebrání sloupce

  • Přidání a odebrání omezení

Další informace o ALTER TABLE funkcích a úplné syntaxi najdete v tématu ALTER TABLE (Transact-SQL)

Závislost vázaná na schéma

cs-CZ: Nativně kompilované uložené procedury musí být vázané na schéma, což znamená, že mají závislost na schématu u tabulek optimalizovaných pro paměť, ke kterým přistupují, a sloupců, na které odkazují. Závislost vázaná na schéma je vztah mezi dvěma entitami, které brání vyřazení nebo nekompatibilní úpravě odkazované entity, pokud existuje odkazující entita.

Pokud například nativně zkompilovaná uložená procedura vázané na schéma odkazuje na sloupec c1 z tabulky, sloupec c1 nelze vynechat. Podobně platí, že pokud existuje takový postup s příkazem INSERT bez seznamu sloupců (např INSERT INTO dbo.mytable VALUES (...). ), nelze v tabulce vynechat žádný sloupec.

Protokolování tabulek ALTER TABLE optimalizovaných pro paměť

V tabulce optimalizované pro paměť se teď většina ALTER TABLE scénářů spouští paralelně a vede k optimalizaci zápisů do transakčního protokolu. Optimalizace se dosahuje pouze protokolováním změn metadat do transakčního protokolu. Následující operace ALTER TABLE však běží jednovláknově a nejsou optimalizované pro log.

Operace s jedním vláknem v tomto případě by protokolovala celý obsah změněné tabulky do transakčního protokolu. Seznam operací s jedním vláknem:

  • Změna nebo přidání sloupce pro použití velkého typu objektu (LOB): nvarchar(max), varchar(max) nebo varbinary(max).

  • Přidání nebo vyřazení indexu COLUMNSTORE

  • Téměř cokoli, co má vliv na sloupec mimo řádek.

    • Způsobí, že se sloupec na řádku přesune mimo řádek.
    • Způsobí, že se sloupec mimo řádek přesune na řádek.
    • Vytvořte nový sloupec mimo řádek.
    • Výjimka: Prodloužení sloupce, který je již mimo standardní řádek, je zaznamenáno optimalizovaným způsobem.

Examples

Následující příklad změní počet kbelíků existujícího indexu hash. Tím se index hash znovu sestaví s novým počtem kontejnerů, zatímco ostatní vlastnosti indexu hash zůstanou stejné.

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

Následující příklad přidá sloupec s omezením NOT NULL a definicí DEFAULT a pomocí funkce WITH VALUES poskytne hodnoty pro každý existující řádek v tabulce. Pokud se funkce WITH VALUES nepoužívá, má každý řádek hodnotu NULL v novém sloupci.

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

Následující příklad přidá omezení primárního klíče do existujícího sloupce.

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

Následující příklad odebere index.

ALTER TABLE Sales.SalesOrderDetail_inmem  
       DROP INDEX ix_ModifiedDate;  
GO

Následující příklad přidá index.

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

Následující příklad přidá více sloupců s indexem a omezeními.

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