Sdílet prostřednictvím


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ěť lze provádět pomocí příkazu ALTER TABLE. V SQL Server 2016 a Azure SQL Database jsou operace ALTER TABLE na tabulkách optimalizovaných pro paměť offline, což znamená, že tabulka není dostupná pro dotazování během probíhající operace. 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 příkazu ALTER TABLE 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.

ALTEROVÝ STŮL

Syntaxe ALTER TABLE slouží 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ána pouze pro tabulky optimalizované pro paměť.

  • Bez použití příkazu ALTER TABLE nejsou příkazy CREATE INDEX, DROP INDEX, ALTER INDEX a 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 funkcích ALTER TABLE a úplné syntaxi naleznete 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á procedura s příkazem INSERT bez seznamu sloupců (např INSERT INTO dbo.mytable VALUES (...). ), nelze v tabulce vynechat žádný sloupec.

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

V tabulce optimalizované pro paměť se většina scénářů ALTER TABLE nyní 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 optimalizovány pro logy.

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 s výchozí definicí 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  

Viz také

tabulkyMemory-Optimized