Sdílet prostřednictvím


Pokračovatelné přidání omezení na tabulku

Platí pro: SQL Server 2022 (16.x) a novější verze databáze SQL Azure SQL DatabaseAzure SQL Managed Instancev Microsoft Fabric

Operace obnovení pro vytvoření a opětovné sestavení online indexu je již podporována pro SQL Server 2019, Azure SQL Database a Azure SQL Managed Instance. Operace s možností obnovení umožňují spuštění operací indexu, když je tabulka online (ONLINE=ON) a také:

  • Pozastavit a znovu spustit operaci vytvoření nebo znovu sestavení indexu několikrát tak, aby se vešly do časového okna údržby

  • Zotavení po selhání vytváření nebo opětovného sestavení indexu, jako jsou převzetí služeb při selhání databáze nebo nedostatek místa na disku.

  • Povolte zkrácení transakčních protokolů během operace vytvoření nebo opětovného sestavení indexu.

  • Při pozastavení operace indexu vyžadují původní i nově vytvořený index místo na disku a musí být aktualizovány během operací DML (Data Manipulat Language ).

Nová rozšíření pro SQL Server 2022, SQL Database a SQL Managed Instance umožňují obnovitelnou operaci příkazu DDL (Data Definition Language)ALTER TABLE ADD CONSTRAINT a přidání primárního nebo jedinečného klíče. Další informace o přidání primárního nebo jedinečného klíče naleznete v tématu ALTER TABLE table_constraint.

Poznámka:

Omezení tabulky s možností obnovení platí jenom pro omezení PRIMÁRNÍHO KLÍČE a JEDINEČNÉHO KLÍČE. Omezení pro obnovitelné přidávání tabulek nejsou podporována pro omezení cizího klíče.

Operace s možností obnovení

V předchozích verzích SQL Serveru bylo možné operaci spustit s volbou ONLINE=ON. Dokončení velké tabulky ale může trvat mnoho hodin a může spotřebovat velký počet prostředků. Existuje také možnost selhání nebo přerušení během takového spuštění. Zavedli jsme obnovitelné možnosti, aby ALTER TABLE ADD CONSTRAINT uživatelé mohli operaci pozastavit během časového období údržby nebo ji restartovat z místa, kde byla přerušena během selhání spuštění, aniž by operaci restartovali od začátku.

Podporované scénáře

Nová možnost obnovení pro ALTER TABLE ADD CONSTRAINT podporuje následující scénáře zákazníků:

  • Pozastavte nebo obnovte spuštěnou ALTER TABLE ADD CONSTRAINT operaci, například pozastavením operace v době údržby a obnovením po dokončení okna údržby.

  • Obnovení ALTER TABLE ADD CONSTRAINT operace po přepnutí při selhání a poruchách systému.

  • Provádění ALTER TABLE ADD CONSTRAINT operace na velké tabulce i přes malou dostupnou velikost protokolu.

Poznámka:

Operace ALTER TABLE ADD CONSTRAINT, která se dá obnovit, vyžaduje, aby se příkaz ALTER spustil online (WITH ONLINE = ON).

Tato funkce je zvlášť užitečná pro velké tabulky.

Syntaxe T-SQL pro ALTER TABLE

Informace o syntaxi, která se používá k povolení obnovitelných operací s omezením tabulky, najdete v syntaxi a možnostech v příkazu ALTER TABLE (Transact-SQL).

Poznámky pro ALTER TABLE

  • Nová klauzule WITH <resumable_options byla přidána do aktuální syntaxe T-SQL v ALTER TABLE (Transact-SQL).

  • Možnost RESUMABLE je nová a byla přidána do stávající syntaxe ALTER TABLE (Transact-SQL).

  • MAX_DURATION = čas [MINUT] použitý s RESUMABLE = ON (vyžaduje ONLINE = ON). MAX_DURATION označuje čas (celočíselná hodnota zadaná v minutách), po který je vykonávána operace omezení pro obnovitelné online přidání, než je pozastavena. Pokud není zadáno, operace pokračuje až do dokončení.

Syntaxe T-SQL pro ALTER INDEX

Chcete-li pozastavit, obnovit nebo přerušit operaci obnovení omezení tabulky pro ALTER TABLE ADD CONSTRAINT, použijte syntaxi T-SQL ALTER INDEX (Transact-SQL).

Pro obnovitelná omezení se použije existující příkaz ALTER INDEX ALL.

ALTER INDEX ALL ON <table_name>  
      { RESUME [WITH (<resumable_index_options>,[...n])]
        | PAUSE
        | ABORT
      }
<resumable_index_option> ::=
 { 
    MAXDOP = max_degree_of_parallelism
    | MAX_DURATION =<time> [MINUTES]
    | <low_priority_lock_wait>  
 }
 <low_priority_lock_wait>::=  
{  
    WAIT_AT_LOW_PRIORITY ( MAX_DURATION = <time> [ MINUTES ] ,   
                          ABORT_AFTER_WAIT = { NONE | SELF | BLOCKERS } )  
}  

Poznámky pro ALTER INDEX

ALTER INDEX ALL ON <Table> PAUSE

  • Pozastavení zastavitelné online operace přidání omezení tabulky, která se provádí

ALTER INDEX ALL ON <Table> RESUME [WITH (<resumable_index_options>,[...n])]

  • Pokračujte v operaci přidání omezení tabulky, která je pozastavena ručně nebo kvůli selhání.

MAX_DURATION použito s RESUMABLE=ON

  • Čas (celočíselná hodnota zadaná v minutách), během něhož se po obnovení provede operace doplnění omezení tabulky. Jakmile vyprší doba, je obnovitelná operace pozastavena, pokud je stále spuštěná.

WAIT_AT_LOW_PRIORITY používaná s RESUMABLE=ON a ONLINE = ON

  • Obnovení operace přidání omezení tabulky online po pozastavení musí čekat na blokující operace v této tabulce. WAIT_AT_LOW_PRIORITY označuje, že operace přidání omezení tabulky bude čekat na zámky s nízkou prioritou, což umožní dalším operacím pokračovat, zatímco operace pro obnovení čeká. Vynechání možnosti WAIT_AT_LOW_PRIORITY odpovídá WAIT_AT_LOW_PRIORITY (MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE). Další informace najdete v tématu WAIT_AT_LOW_PRIORITY.

ALTER INDEX ALL ON <Table> ABORT

  • Přerušit běžící nebo pozastavenou operaci přidání omezení tabulky, která byla deklarována jako obnovitelná. Operace přerušení musí být explicitně provedena jako příkaz ABORT, který ukončí obnovitelnou operaci omezování. Selhání nebo pozastavení operace omezení tabulky s možností obnovení neukončí její spuštění. Místo toho ponechá operaci v neurčitém pozastaveném stavu.

Další informace o možnostech PAUSE, RESUME a ABORT, které jsou k dispozici pro obnovitelné operace, naleznete v tématu ALTER INDEX (Transact-SQL).

Zobrazit stav obnovitelné operace

Pokud si chcete prohlédnout stav operace omezení tabulky, kterou lze obnovit, použijte zobrazení sys.index_resumable_operations.

Povolení

Vyžaduje oprávnění ALTER k tabulce.

Nevyžadují se žádná nová oprávnění pro možné obnovení ALTER TABLE ADD CONSTRAINT.

Examples

Tady je několik příkladů použití operací přidání omezení tabulky, které lze pozastavit a pokračovat v nich.

Příklad 1

Operace obnovení ALTER TABLE pro přidání primárního klíče clusterovaného ve sloupci (a) s MAX_DURATION 240 minut.

ALTER TABLE table1
ADD CONSTRAINT PK_Constrain PRIMARY KEY CLUSTERED (a)
WITH (ONLINE = ON, MAXDOP = 2, RESUMABLE = ON, MAX_DURATION = 240);

Příklad 2

Obnovitelná operace ALTER TABLE pro přidání jedinečného omezení u dvou sloupců (a a b) trvající 240 minut MAX_DURATION.

ALTER TABLE table2
ADD CONSTRAINT PK_Constrain UNIQUE CLUSTERED (a,b)
WITH (ONLINE = ON, MAXDOP = 2, RESUMABLE = ON, MAX_DURATION = 240);

Příklad 3

ALTER TABLE operace pro přidání primárního klíče jako clusterovaného, když je pozastavena a obnovena.

Následující tabulka ukazuje dvě relace (Session #1 a Session #2) spouštěné chronologicky pomocí následujících příkazů T-SQL. Session #1 provede obnovitelnou ALTER TABLE ADD CONSTRAINT operaci vytvoření primárního klíče ve sloupci Col1. Session #2 zkontroluje stav provádění pro běžící omezení. Po nějaké době pozastaví opakovatelný úkon. Session #2 zkontroluje stav pozastaveného omezení. Session #1 Nakonec obnoví pozastavené omezení a Session #2 znovu zkontroluje stav.

Sezení č. 1 Sezení č. 2
Proveďte příkaz s možností pokračování přidání omezení

ALTER TABLE TestConstraint
ADD CONSTRAINT PK_TestConstraint PRIMARY KEY (Col1)
WITH (ONLINE = ON, MAXDOP = 2, RESUMABLE = ON, MAX_DURATION = 30);
Kontrola stavu omezení

SELECT sql_text, state_desc, percent_complete
FROM sys.index_resumable_operations;
Výstup znázorňující operaci

sql_text state_desc procenta_kompletní
ALTER TABLE TestConstraint (...)BĚŽÍCÍ43.552
Pozastavení obnovitelného omezení

ALTER INDEX ALL ON TestConstraint PAUSE;
Error

Msg 1219, Level 16, State 1, Line 6
Your session has been disconnected because of a high priority DDL operation.

Msg 1750, Level 16, State 1, Line 6
Could not create constraint or index. See previous errors.

Msg 0, Level 20, State 0, Line 5
A severe error occurred on the current command.
The results, if any, should be discarded.
Kontrola stavu omezení

SELECT sql_text, state_desc, percent_complete
FROM sys.index_resumable_operations;
Výstup znázorňující operaci

sql_text state_desc procenta_dokončení
ALTER TABLE TestConstraint (...)POZASTAVENO65.339
ALTER INDEX ALL ON TestConstraint RESUME;
Kontrola stavu omezení

SELECT sql_text, state_desc, percent_complete
FROM sys.index_resumable_operations;
Výstup znázorňující operaci

sql_text state_desc procento_dokončeno
ALTER TABLE TestConstraint (...)BĚŽÍCÍ90.238

Po dokončení operace spusťte následující příkaz T-SQL a zkontrolujte omezení:

SELECT constraint_name, table_name, constraint_type 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE='PRIMARY KEY';
GO

Tady je sada výsledků:

název omezení název_tabulky typ_omezení
PK_Constraint TestConstraint PRIMÁRNÍ KLÍČ

Viz také