Lezen in het Engels

Delen via


ALTER INDEX (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-database in Microsoft Fabric

Wijzigt een bestaande tabel of weergave-index (rowstore, columnstore of XML) door de index uit te schakelen, opnieuw te bouwen of opnieuw te ordenen; of door opties voor de index in te stellen.

Transact-SQL syntaxisconventies

Syntaxis

Syntaxis voor SQL Server, Azure SQL Database en Azure SQL Managed Instance.

syntaxsql
ALTER INDEX { index_name | ALL } ON <object>
{
      REBUILD {
            [ PARTITION = ALL [ WITH ( <rebuild_index_option> [ , ...n ] ) ] ]
          | [ PARTITION = partition_number [ WITH ( <single_partition_rebuild_index_option> [ , ...n ] ) ] ]
      }
    | DISABLE
    | REORGANIZE  [ PARTITION = partition_number ] [ WITH ( <reorganize_option>  ) ]
    | SET ( <set_index_option> [ , ...n ] )
    | RESUME [ WITH (<resumable_index_option> [ , ...n ] ) ]
    | PAUSE
    | ABORT
}
[ ; ]

<object> ::=
{
    { database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }
}

<rebuild_index_option> ::=
{
      PAD_INDEX = { ON | OFF }
    | FILLFACTOR = fillfactor
    | SORT_IN_TEMPDB = { ON | OFF }
    | IGNORE_DUP_KEY = { ON | OFF }
    | STATISTICS_NORECOMPUTE = { ON | OFF }
    | STATISTICS_INCREMENTAL = { ON | OFF }
    | ONLINE = { ON [ ( <low_priority_lock_wait> ) ] | OFF }
    | RESUMABLE = { ON | OFF }
    | MAX_DURATION = <time> [ MINUTES ]
    | ALLOW_ROW_LOCKS = { ON | OFF }
    | ALLOW_PAGE_LOCKS = { ON | OFF }
    | MAXDOP = max_degree_of_parallelism
    | DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE }
        [ ON PARTITIONS ( { <partition_number> [ TO <partition_number> ] } [ , ...n ] ) ]
    | XML_COMPRESSION = { ON | OFF }
        [ ON PARTITIONS ( { <partition_number> [ TO <partition_number> ] } [ , ...n ] ) ] }

<single_partition_rebuild_index_option> ::=
{
      SORT_IN_TEMPDB = { ON | OFF }
    | MAXDOP = max_degree_of_parallelism
    | RESUMABLE = { ON | OFF }
    | MAX_DURATION = <time> [ MINUTES ]
    | DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE }
    | XML_COMPRESSION = { ON | OFF }
    | ONLINE = { ON [ ( <low_priority_lock_wait> ) ] | OFF }
}

<reorganize_option> ::=
{
       LOB_COMPACTION = { ON | OFF }
    |  COMPRESS_ALL_ROW_GROUPS =  { ON | OFF }
}

<set_index_option> ::=
{
      ALLOW_ROW_LOCKS = { ON | OFF }
    | ALLOW_PAGE_LOCKS = { ON | OFF }
    | OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }
    | IGNORE_DUP_KEY = { ON | OFF }
    | STATISTICS_NORECOMPUTE = { ON | OFF }
    | COMPRESSION_DELAY = { 0 | delay [ Minutes ] }
}

<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 } )
}

Syntaxis voor Azure Synapse Analytics en Analytics Platform System (PDW).

syntaxsql
ALTER INDEX { index_name | ALL }
    ON [ schema_name. ] table_name
{
      REBUILD {
            [ PARTITION = ALL [ WITH ( <rebuild_index_option> ) ] ]
          | [ PARTITION = partition_number [ WITH ( <single_partition_rebuild_index_option> ) ] ]
      }
    | DISABLE
    | REORGANIZE [ PARTITION = partition_number ]
}
[ ; ]

<rebuild_index_option> ::=
{
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
        [ ON PARTITIONS ( { <partition_number> [ TO <partition_number> ] } [ , ...n ] ) ]
    | XML_COMPRESSION = { ON | OFF }
        [ ON PARTITIONS ( { <partition_number> [ TO <partition_number> ] } [ , ...n ] ) ]
}

<single_partition_rebuild_index_option> ::=
{
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
    | XML_COMPRESSION = { ON | OFF }
}

Argumenten

index_name

De naam van de index. Indexnamen moeten uniek zijn binnen een tabel of weergave, maar hoeven niet uniek te zijn binnen een database. Indexnamen moeten voldoen aan de regels van id's.

ALLE

Hiermee geeft u alle indexen op die zijn gekoppeld aan de tabel of weergave, ongeacht het indextype. Als u ALL opgeeft, mislukt de instructie als een of meer indexen zich in een offline- of alleen-lezen bestandsgroep bevinden of de opgegeven bewerking niet is toegestaan voor een of meer indextypen. De volgende tabel bevat de indexbewerkingen en niet-toegestane indextypen.

Het trefwoord ALL gebruiken met deze bewerking Mislukt als de tabel een of meer bevat
REBUILD WITH ONLINE = ON XML-index

Ruimtelijke index

Columnstore-index in SQL Server 2017 (14.x) en oudere versies. Latere versies ondersteunen online herbouwen van columnstore-indexen.
REBUILD PARTITION = <partition_number> Niet-gepartitioneerde index, XML-index, ruimtelijke index of uitgeschakelde index
REORGANIZE Indexen met ALLOW_PAGE_LOCKS ingesteld op OFF
REORGANIZE PARTITION = <partition_number> Niet-gepartitioneerde index, XML-index, ruimtelijke index of uitgeschakelde index
IGNORE_DUP_KEY = ON XML-index

Ruimtelijke index

Columnstore-index 1
ONLINE = ON XML-index

Ruimtelijke index
Columnstore-index 1
RESUMABLE = ON Hervatbare indexen worden niet ondersteund met het trefwoord ALL

Als ALL is opgegeven met PARTITION = <partition_number>, moeten alle indexen worden uitgelijnd. Dit betekent dat ze worden gepartitioneerd op basis van gelijkwaardige partitiefuncties. Als u ALL met PARTITION gebruikt, worden alle indexpartities met dezelfde <partition_number> opnieuw opgebouwd of geordend. Zie Gepartitioneerde tabellen en indexenvoor meer informatie over gepartitioneerde indexen.

Zie Richtlijnen voor online indexbewerkingenvoor meer informatie over online indexbewerkingen.

database_name

De naam van de database.

schema_name

De naam van het schema waartoe de tabel of weergave behoort.

table_or_view_name

De naam van de tabel of weergave die aan de index is gekoppeld. Als u indexdetails voor een tabel of weergave wilt weergeven, gebruikt u de sys.indexes catalogusweergave.

Azure SQL Database ondersteunt de driedelige naamindeling <database_name>.<schema_name>.<object_name> wanneer <database_name> de naam van de huidige database is of <database_name>tempdb is en <object_name> begint met # of ##. Als de schemanaam dbois, kan <schema_name> worden weggelaten.

REBUILD [ WITH ( <rebuild_index_option> [ ,... n ] ) ]

van toepassing op: SQL Server 2012 (11.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance

Hiermee geeft u op dat de index opnieuw wordt opgebouwd met behulp van dezelfde kolommen, indextype, kenmerk uniekheid en sorteervolgorde. REBUILD schakelt een uitgeschakelde index in. Als u een geclusterde index opnieuw opbouwt, worden gekoppelde niet-geclusterde indexen niet opnieuw opgebouwd, tenzij het trefwoord ALL is opgegeven. Als er geen indexopties zijn opgegeven, worden de bestaande indexoptiewaarden in sys.indexes toegepast. Voor een indexoptie waarvan de waarde niet wordt weergegeven in sys.indexes, is de standaardwaarde die wordt aangegeven in de argumentdefinitie van de optie van toepassing.

Als ALL is opgegeven en de onderliggende tabel een heap is, heeft de herbouwbewerking geen effect op de heap. Alle niet-geclusterde indexen die aan de tabel zijn gekoppeld, worden opnieuw opgebouwd.

De REBUILD bewerking kan minimaal worden vastgelegd als het databaseherstelmodel bulksgewijs is geregistreerd of eenvoudig is.

Wanneer u een primaire XML-index opnieuw opbouwt, is de onderliggende gebruikerstabel niet beschikbaar voor de duur van de indexbewerking.

Voor columnstore-indexen wordt de herbouwbewerking uitgevoerd:

  • Hiermee worden alle gegevens opnieuw gecomprimeerd in de columnstore. Er bestaan twee kopieën van de columnstore-index terwijl de herbouwbewerking wordt uitgevoerd. Wanneer het opnieuw opbouwen is voltooid, verwijdert database-engine de oorspronkelijke columnstore-index.
  • Behoudt de sorteervolgorde niet, indien van toepassing. Als u een columnstore-index opnieuw wilt opbouwen en een sorteervolgorde wilt behouden of introduceren, gebruikt u de CREATE [CLUSTERED] COLUMNSTORE INDEX ... ORDER (...) ... WITH (DROP_EXISTING = ON)-instructie.

Zie Indexonderhoud optimaliseren om de queryprestaties te verbeteren en het resourceverbruik te verminderenvoor meer informatie.

VERDELEN

Hiermee geeft u op dat slechts één partitie van een index opnieuw wordt opgebouwd of opnieuw wordt georganiseerd. PARTITION kan niet worden opgegeven als index_name geen gepartitioneerde index is.

PARTITION = ALL alle partities opnieuw opbouwt.

Waarschuwing

Het maken en herbouwen van niet-uitgelijnde indexen in een tabel met meer dan 1000 partities is mogelijk, maar wordt niet ondersteund. Dit kan leiden tot verminderde prestaties of overmatig geheugenverbruik tijdens deze bewerkingen. Microsoft raadt aan alleen uitgelijnde indexen te gebruiken wanneer het aantal partities groter is dan 1000.

  • partition_number

    Het partitienummer van een gepartitioneerde index die opnieuw moet worden opgebouwd of opnieuw moet worden georganiseerd. partition_number is een constante expressie die naar variabelen kan verwijzen. Deze omvatten door de gebruiker gedefinieerde typevariabelen of -functies en door de gebruiker gedefinieerde functies, maar kunnen niet verwijzen naar een Transact-SQL-instructie. partition_number moet bestaan of de instructie mislukt.

  • WITH (<single_partition_rebuild_index_option>)

    SORT_IN_TEMPDB, MAXDOP, DATA_COMPRESSIONen XML_COMPRESSION zijn de opties die kunnen worden opgegeven wanneer u één partitie opnieuw bouwt met behulp van de (PARTITION = partition_number) syntaxis. XML-indexen kunnen niet worden opgegeven in één herbouwbewerking voor partities.

UITSCHAKELEN

Hiermee wordt de index gemarkeerd als uitgeschakeld en niet beschikbaar voor gebruik door de database-engine. Elke index kan worden uitgeschakeld. De indexdefinitie van een uitgeschakelde index blijft aanwezig in de systeemcatalogus zonder onderliggende indexgegevens. Als u een geclusterde index uitschakelt, voorkomt u dat gebruikers toegang hebben tot de onderliggende tabelgegevens. Als u een index wilt inschakelen, gebruikt u ALTER INDEX REBUILD of CREATE INDEX WITH DROP_EXISTING. Zie Indexen en beperkingen uitschakelen en Indexen en beperkingen inschakelenvoor meer informatie.

Een rowstore-index OPNIEUW ORDEN

Voor rijstore-indexen geeft REORGANIZE aan dat het niveau van het indexblad moet worden gereorganiseert. De REORGANIZE bewerking is:

  • Altijd online uitgevoerd. Dit betekent dat tabelvergrendelingen op lange termijn niet worden bewaard en dat er geen query's of updates voor de gegevens in de onderliggende tabel kunnen worden uitgevoerd tijdens de ALTER INDEX REORGANIZE transactie.
  • Niet toegestaan voor een uitgeschakelde index.
  • Niet toegestaan wanneer ALLOW_PAGE_LOCKS is ingesteld op OFF.
  • Niet teruggedraaid wanneer deze worden uitgevoerd binnen een transactie en de transactie wordt teruggedraaid.

Notitie

Wanneer ALTER INDEX REORGANIZE expliciete transacties gebruikt (bijvoorbeeld ALTER INDEX binnen een BEGIN TRAN ... COMMIT/ROLLBACK) in plaats van de standaard impliciete transactiemodus, wordt het vergrendelingsgedrag van REORGANIZE restrictiever, waardoor blokkeren mogelijk wordt veroorzaakt. Zie SET IMPLICIT_TRANSACTIONSvoor meer informatie over impliciete transacties.

Zie Indexonderhoud optimaliseren om de queryprestaties te verbeteren en het resourceverbruik te verminderenvoor meer informatie.

OPNIEUW ORGANISEREN MET ( LOB_COMPACTION = { AAN | UIT } )

Van toepassing op rijstore-indexen.

  • OP

    • Hiermee geeft u alle pagina's die gegevens van deze grote objectgegevenstypen (LOB) bevatten: afbeelding, tekst, ntext, varchar(max), nvarchar(max), varbinary(max)en xml-. Door deze gegevens te comprimeren, kan de grootte van de gegevens op schijf worden verkleind.
    • Voor een geclusterde index worden hiermee alle LOB-kolommen gecomprimeerd die zich in de tabel bevinden.
    • Voor een niet-geclusterde index worden hiermee alle LOB-kolommen gecomprimeerd die niet-sleutelkolommen (opgenomen) in de index zijn.
    • REORGANIZE ALL voert LOB-compressie uit op alle indexen. Voor elke index worden alle LOB-kolommen in de geclusterde index, onderliggende tabel of opgenomen kolommen in een niet-geclusterde index gecomprimeerd.
  • AF

    • Pagina's die grote objectgegevens bevatten, worden niet gecomprimeerd.
    • OFF heeft geen effect op een heap.

Een columnstore-index OPNIEUW ORGANISEREN

Voor columnstore-indexen comprimeert REORGANIZE elke gesloten deltarijgroep in de columnstore als een gecomprimeerde rijgroep. De REORGANIZE bewerking wordt altijd online uitgevoerd. Dit betekent dat tabelvergrendelingen op lange termijn niet worden bewaard en dat query's of updates van de onderliggende tabel tijdens de ALTER INDEX REORGANIZE transactie kunnen worden voortgezet.

Zie Indexonderhoud optimaliseren om de queryprestaties te verbeteren en het resourceverbruik te verminderenvoor meer informatie.

  • REORGANIZE is niet vereist om de gesloten deltarijgroepen te verplaatsen naar gecomprimeerde rijgroepen. Het tm-proces (background tuple-mover) wordt periodiek geactiveerd om de gesloten deltarijgroepen te comprimeren. U wordt aangeraden REORGANIZE te gebruiken wanneer tuple-mover achterloopt. REORGANIZE kan rijgroepen agressief comprimeren.
  • Als u alle geopende en gesloten rijgroepen wilt comprimeren, raadpleegt u de REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS).

Voor columnstore-indexen in SQL Server 2016 (13.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance voert REORGANIZE de volgende extra defragmentatieoptimalisaties online uit:

  • Verwijdert fysiek verwijderde rijen uit een rijgroep wanneer 10% of meer van de rijen logisch zijn verwijderd. De verwijderde bytes worden teruggevorderd op de fysieke media. Als een gecomprimeerde rijgroep van 1 miljoen rijen bijvoorbeeld 100.000 rijen heeft verwijderd, verwijdert de database-engine de verwijderde rijen en comprimeert de rijgroep met 900.000 rijen.

  • Combineert een of meer gecomprimeerde rijgroepen om rijen per rijgroep te verhogen tot maximaal 1.048.576 rijen. Als u bijvoorbeeld 5 batches van 102.400 rijen bulksgewijs importeert, krijgt u vijf gecomprimeerde rijgroepen. Als u REORGANIZEuitvoert, worden deze rijgroepen samengevoegd in 1 gecomprimeerde rijgroep met 512.000 rijen. Hierbij wordt ervan uitgegaan dat er geen limieten voor woordenlijstgrootte of geheugen zijn.

  • Voor rijgroepen waarin 10% of meer rijen logisch zijn verwijderd, probeert de database-engine deze rijgroep te combineren met een of meer rijengroepen. Rijgroep 1 wordt bijvoorbeeld gecomprimeerd met 500.000 rijen en rijgroep 21 wordt gecomprimeerd met het maximum van 1.048.576 rijen. Rijgroep 21 heeft 60% van de rijen die 409.830 rijen verlaten. De database-engine biedt de voorkeur aan het combineren van deze twee rijgroepen om een nieuwe rijgroep met 909.830 rijen te comprimeren.

OPNIEUW ORGANISEREN MET ( COMPRESS_ALL_ROW_GROUPS = { AAN | UIT } )

Van toepassing op columnstore-indexen.

van toepassing op: SQL Server 2016 (13.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance

COMPRESS_ALL_ROW_GROUPS biedt een manier om open of gesloten deltarijgroepen af te dwingen in de columnstore. Met deze optie is het niet nodig om de columnstore-index opnieuw te bouwen om de deltarijgroepen leeg te maken. In combinatie met de andere functies voor het verwijderen en samenvoegen van de fragmentatie, is het niet langer nodig om in de meeste situaties een columnstore-index opnieuw te bouwen.

  • OP

    Dwingt alle rijgroepen in de columnstore, ongeacht de grootte en status (gesloten of geopend).

  • AF

    Hiermee worden alle gesloten rijgroepen in de columnstore gedrijpt.

Zie Indexonderhoud optimaliseren om de queryprestaties te verbeteren en het resourceverbruik te verminderenvoor meer informatie.

SET ( <set_index optie> [ ,... n ] )

Hiermee wijzigt u de indexopties zonder de index opnieuw te bouwen of opnieuw te ordenen. SET kan niet worden opgegeven voor een uitgeschakelde index.

PAD_INDEX = { ON | UIT }

Hiermee geeft u indexopvulling. De standaardwaarde is OFF.

  • OP

    Het percentage vrije ruimte dat is opgegeven door vulfactor, wordt toegepast op de pagina's op tussenliggend niveau van de index. Als FILLFACTOR niet tegelijkertijd is opgegeven PAD_INDEX is ingesteld op ON, wordt de waarde van de vulfactor in sys.indexes gebruikt.

  • AF

    De pagina's op tussenliggend niveau zijn gevuld met bijna-capaciteit, waardoor er voldoende ruimte is voor ten minste één rij met de maximale grootte van de index, rekening houdend met de set sleutels op de tussenliggende pagina's. Dit treedt ook op als PAD_INDEX is ingesteld op ON, maar de vulfactor niet is opgegeven.

Zie CREATE INDEXvoor meer informatie.

FILLFACTOR = fillfactor

Hiermee geeft u een percentage op dat aangeeft hoe vol de database-engine het bladniveau van elke indexpagina moet maken tijdens het maken of wijzigen van de index. De waarde voor fillfactor moet een geheel getal tussen 1 en 100 zijn. De standaardwaarde is 0. Vulfactorwaarden 0 en 100 zijn in alle opzichten hetzelfde.

Een expliciete instelling FILLFACTOR is alleen van toepassing wanneer de index voor het eerst wordt gemaakt of opnieuw wordt opgebouwd. De database-engine behoudt niet dynamisch het opgegeven percentage lege ruimte op de pagina's. Zie CREATE INDEXvoor meer informatie.

Gebruik fill_factor in sys.indexesom de instelling van de vulfactor weer te geven.

Belangrijk

Als u een index maakt met een FILLFACTOR kleiner dan 100, neemt de hoeveelheid opslagruimte die de gegevens in beslag nemen toe, omdat de database-engine de gegevens herdistribueert volgens de vulfactor bij het maken of herbouwen van een index.

SORT_IN_TEMPDB = { ON | UIT }

Hiermee geeft u op of tijdelijke sorteerresultaten moeten worden opgeslagen in tempdb. De standaardwaarde is OFF, met uitzondering van Azure SQL Database Hyperscale. Voor alle indexbuildbewerkingen in Hyperscale wordt SORT_IN_TEMPDB altijd ON tenzij een hervatbare indexbuild wordt gebruikt. Voor hervatbare index builds wordt SORT_IN_TEMPDB altijd OFF.

  • OP

    De tussenliggende sorteerresultaten die worden gebruikt om de index te bouwen, worden opgeslagen in tempdb. Dit kan de tijd verkorten die nodig is om een index te maken. Dit verhoogt echter de hoeveelheid schijfruimte die wordt gebruikt tijdens de indexbuild.

  • AF

    De tussenliggende sorteerresultaten worden opgeslagen in dezelfde database als de index.

Als een sorteerbewerking niet vereist is of als de sortering in het geheugen kan worden uitgevoerd, wordt de optie SORT_IN_TEMPDB genegeerd.

Zie SORT_IN_TEMPDB optie voor indexenvoor meer informatie.

IGNORE_DUP_KEY = { ON | UIT }

Hiermee geeft u het foutbericht op wanneer een invoegbewerking probeert dubbele sleutelwaarden in een unieke index in te voegen. De optie IGNORE_DUP_KEY is alleen van toepassing op het invoegen van bewerkingen nadat de index is gemaakt of opnieuw is opgebouwd. De standaardwaarde is OFF.

  • OP

    Er treedt een waarschuwingsbericht op wanneer dubbele sleutelwaarden worden ingevoegd in een unieke index. Alleen de rijen die de uniekheidsbeperking schenden, worden niet ingevoegd.

  • AF

    Er treedt een foutbericht op wanneer dubbele sleutelwaarden worden ingevoegd in een unieke index. De hele INSERT bewerking wordt teruggedraaid.

IGNORE_DUP_KEY kan niet worden ingesteld op ON voor indexen die zijn gemaakt in een weergave, niet-unieke indexen, XML-indexen, ruimtelijke indexen en gefilterde indexen.

Als u de IGNORE_DUP_KEY-instelling voor een index wilt weergeven, gebruikt u de kolom ignore_dup_key in de sys.indexes catalogusweergave.

In achterwaarts compatibele syntaxis is WITH IGNORE_DUP_KEY gelijk aan WITH IGNORE_DUP_KEY = ON.

STATISTICS_NORECOMPUTE = { AAN | UIT }

Schakel de optie voor het bijwerken van automatische statistieken, AUTO_STATISTICS_UPDATE, uit of in voor de statistieken in de index. De standaardwaarde is OFF.

  • OP

    Automatische updates voor statistieken worden uitgeschakeld nadat de index opnieuw is opgebouwd.

  • AF

    Automatische updates voor statistieken worden ingeschakeld nadat de index opnieuw is opgebouwd.

Als u het automatisch bijwerken van statistieken wilt herstellen, stelt u de STATISTICS_NORECOMPUTE in op OFFof voert u UPDATE STATISTICS uit zonder de NORECOMPUTE component.

Waarschuwing

Als u automatische hercomputatie van statistieken uitschakelt door STATISTICS_NORECOMPUTE = ONin te stellen, kunt u voorkomen dat de queryoptimalisatie optimale uitvoeringsplannen kiest voor query's die betrekking hebben op de tabel.

Als u STATISTICS_NORECOMPUTE instelt op ON wordt het bijwerken van indexstatistieken die optreden tijdens de herbouwbewerking van de index niet voorkomen.

STATISTICS_INCREMENTAL = { ON | UIT }

van toepassing op: SQL Server 2014 (12.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance

Wanneer ON, zijn de statistieken die op de index zijn gemaakt per partitiestatistieken. Wanneer OFF, worden de bestaande statistieken verwijderd en worden de statistieken opnieuw berekend door de database-engine. De standaardwaarde is OFF.

Als statistieken per partitie niet worden ondersteund, wordt de optie genegeerd en wordt er een waarschuwing gegenereerd. Incrementele statistieken worden in de volgende gevallen niet ondersteund:

  • Statistieken die zijn gemaakt met indexen die niet zijn gepartitioneerd met de basistabel
  • Statistieken die zijn gemaakt voor leesbare secundaire databases voor beschikbaarheidsgroepen
  • Statistieken die zijn gemaakt voor alleen-lezendatabases
  • Statistieken die zijn gemaakt voor gefilterde indexen
  • Statistieken die zijn gemaakt in weergaven
  • Statistieken die zijn gemaakt in interne tabellen
  • Statistieken die zijn gemaakt met ruimtelijke indexen of XML-indexen

ONLINE = { ON | UIT }

Hiermee geeft u op of onderliggende tabellen en bijbehorende indexen beschikbaar zijn voor query's en gegevenswijziging tijdens de indexbewerking. De standaardwaarde is OFF.

Voor een XML-index of ruimtelijke index wordt alleen ONLINE = OFF ondersteund en als ONLINE is ingesteld op ON er een fout optreedt.

Belangrijk

Online indexbewerkingen zijn niet beschikbaar in elke editie van Microsoft SQL Server. Zie -edities en ondersteunde functies van SQL Server 2022voor een lijst met functies die worden ondersteund door de edities van SQL Server.

  • OP

    Langetermijntabelvergrendelingen worden niet bewaard voor de duur van de indexbewerking. Tijdens de hoofdfase van de indexbewerking wordt alleen een intentievergrendeling (IS) op de brontabel bewaard. Hierdoor kunnen query's of updates voor de onderliggende tabel en indexen worden voortgezet. Aan het begin van de bewerking wordt een gedeelde vergrendeling (S) gedurende een korte periode op het bronobject bewaard. Aan het einde van de bewerking wordt gedurende een korte periode een gedeelde (S) vergrendeling op het object verkregen als er een niet-geclusterde index wordt gemaakt. Een schemawijzigingsvergrendeling (Sch-M) wordt verkregen wanneer een geclusterde index online wordt gemaakt of verwijderd en wanneer een geclusterde of niet-geclusterde index opnieuw wordt opgebouwd. ONLINE kan niet worden ingesteld op ON wanneer een index wordt gemaakt in een lokale tijdelijke tabel.

    Notitie

    U kunt de optie WAIT_AT_LOW_PRIORITY gebruiken om tijdens online indexbewerkingen blokkeren of blokkeren te voorkomen. Zie WAIT_AT_LOW_PRIORITY met online indexbewerkingenvoor meer informatie.

  • AF

    Tabelvergrendelingen worden toegepast voor de duur van de indexbewerking. Een offline indexbewerking waarmee een geclusterde, ruimtelijke of XML-index wordt gemaakt, herbouwd of verwijderd of een niet-geclusterde index wordt gemaakt, opnieuw wordt opgebouwd of verwijderd, wordt een schemawijziging (Sch-M) op de tabel verkregen. Hiermee voorkomt u dat alle gebruikers toegang hebben tot de onderliggende tabel voor de duur van de bewerking. Een offline indexbewerking waarmee een niet-geclusterde index wordt gemaakt, wordt in eerste instantie een gedeelde (S) vergrendeling voor de tabel verkregen. Hiermee voorkomt u dat de onderliggende tabeldefinitie wordt gewijzigd, maar de gegevens in de tabel kunnen worden gelezen en gewijzigd terwijl de indexbuild wordt uitgevoerd.

Zie Indexbewerkingen online uitvoeren en Richtlijnen voor online indexbewerkingenvoor meer informatie.

Indexen, inclusief indexen voor globale tijdelijke tabellen, kunnen online opnieuw worden opgebouwd, met uitzondering van de volgende gevallen:

  • XML-index
  • Indexeren op een lokale tijdelijke tabel
  • Initiële unieke geclusterde index in een weergave
  • Uitgeschakelde geclusterde indexen
  • Geclusterde columnstore-indexen in SQL Server 2017 (14.x)) en eerdere versies
  • Niet-geclusterde columnstore-indexen in SQL Server 2016 (13.x)) en eerdere versies
  • Geclusterde index, als de onderliggende tabel LOB-gegevenstypen bevat (afbeelding, ntext, tekst) en ruimtelijke gegevenstypen
  • varchar(max) en varbinary(max) kolommen kunnen geen deel uitmaken van een indexsleutel. In SQL Server (te beginnen met SQL Server 2012 (11.x)), in Azure SQL Database en in Azure SQL Managed Instance, kunnen wanneer een tabel varchar(max) of varbinary(max) kolommen bevat, een geclusterde index met andere kolommen worden gebouwd of opnieuw opgebouwd met behulp van de optie ONLINE.

Zie Hoe online indexbewerkingen werkenvoor meer informatie.

HERVATBAAR = { AAN | UIT}

van toepassing op: SQL Server 2017 (14.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance

Hiermee geeft u op of een online indexbewerking hervat kan worden.

  • OP

    De indexbewerking kan worden hervat.

  • AF

    De indexbewerking kan niet worden hervat.

MAX_DURATION = tijd [MINUTEN] gebruikt met RESUMABLE = ON (hiervoor is ONLINE = ONvereist)

van toepassing op: SQL Server 2017 (14.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance

Hiermee geeft u op hoe lang, in minuten voor gehele getallen, een hervatbare indexbewerking wordt uitgevoerd voordat deze wordt onderbroken.

ALLOW_ROW_LOCKS = { AAN | UIT }

Hiermee geeft u op of rijvergrendelingen zijn toegestaan. De standaardwaarde is ON.

  • OP

    Rijvergrendelingen zijn toegestaan bij toegang tot de index. De database-engine bepaalt wanneer rijvergrendelingen worden gebruikt.

  • AF

    Rijvergrendelingen worden niet gebruikt.

ALLOW_PAGE_LOCKS = { AAN | UIT }

Hiermee geeft u op of paginavergrendelingen zijn toegestaan. De standaardwaarde is ON.

  • OP

    Paginavergrendelingen zijn toegestaan wanneer u toegang hebt tot de index. De database-engine bepaalt wanneer paginavergrendelingen worden gebruikt.

  • AF

    Paginavergrendelingen worden niet gebruikt.

OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | UIT }

van toepassing op: SQL Server 2019 (15.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance

Hiermee geeft u op of u wilt optimaliseren om conflicten met laatste pagina's te voorkomen. De standaardwaarde is OFF. Zie Sequentiële sleutelsvoor meer informatie.

MAXDOP = max_degree_of_parallelism

Overschrijft de maximale mate van parallelle uitvoering configuratieoptie voor de indexbewerking. Zie De maximale mate van parallelle configuratie van server configurerenvoor meer informatie. Gebruik MAXDOP om de mate van parallelle uitvoering en het resulterende resourceverbruik voor een indexbuildbewerking te beperken.

Hoewel de optie MAXDOP syntactisch wordt ondersteund voor alle XML-indexen en ruimtelijke indexen, gebruikt ALTER INDEX momenteel slechts één processor.

max_degree_of_parallelism kan het volgende zijn:

  • 1

    Onderdrukt het genereren van parallelle plannen.

  • >1

    Hiermee beperkt u de maximale mate van parallelle uitvoering die wordt gebruikt in een parallelle indexbewerking tot het opgegeven getal of minder op basis van de huidige systeemworkload.

  • 0 (standaard)

    Maakt gebruik van de mate van parallelle uitvoering die is opgegeven op server-, database- of workloadgroepsniveau, tenzij verminderd op basis van de huidige systeemworkload.

Zie Parallelle indexbewerkingen configurerenvoor meer informatie.

Notitie

Parallelle indexbewerkingen zijn niet beschikbaar in elke editie van SQL Server. Zie -edities en ondersteunde functies van SQL Server 2022voor een lijst met functies die worden ondersteund door de edities van SQL Server.

COMPRESSION_DELAY = { 0 | duur [ minuten ] }

van toepassing op: SQL Server (te beginnen met SQL Server 2016 (13.x)), Azure SQL Database en Azure SQL Managed Instance

Voor een tabel op basis van een schijf met een columnstore-index geeft u het minimale aantal minuten op dat een deltarijgroep met de gesloten status in het deltaarchief moet blijven staan voordat de Database Engine deze kan comprimeren in een gecomprimeerde rijgroep. Omdat tabellen op basis van schijven geen invoeg- en updatetijden voor afzonderlijke rijen bijhouden, past de database-engine deze vertraging alleen toe op rijgroepen van Delta-opslag in de gesloten status.

De standaardwaarde is 0 minuten.

Zie Aan de slag met columnstore voor realtime operationele analysesvoor aanbevelingen voor het gebruik van COMPRESSION_DELAY.

DATA_COMPRESSION

Hiermee geeft u de optie voor gegevenscompressie voor de opgegeven index, partitienummer of bereik van partities. De opties zijn als volgt:

  • GEEN

    Indexen of opgegeven partities worden niet gecomprimeerd. Dit geldt niet voor columnstore-indexen.

  • ROEIEN

    Indexen of opgegeven partities worden gecomprimeerd met behulp van rijcompressie. Dit geldt niet voor columnstore-indexen.

  • BLADZIJDE

    Index- of opgegeven partities worden gecomprimeerd met behulp van paginacompressie. Dit geldt niet voor columnstore-indexen.

  • COLUMNSTORE

    van toepassing op: SQL Server 2014 (12.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance

    Is alleen van toepassing op columnstore-indexen, inclusief niet-geclusterde columnstore- en geclusterde columnstore-indexen. Als u COLUMNSTORE opgeeft, worden alle andere gegevenscompressie, inclusief COLUMNSTORE_ARCHIVE, verwijderd.

  • COLUMNSTORE_ARCHIVE

    van toepassing op: SQL Server 2014 (12.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance

    Is alleen van toepassing op columnstore-indexen, inclusief niet-geclusterde columnstore- en geclusterde columnstore-indexen. COLUMNSTORE_ARCHIVE de opgegeven partitie verder comprimeert naar een kleinere grootte. Dit kan worden gebruikt voor archivering, of voor andere situaties die een kleinere opslagruimte vereisen en meer tijd voor opslag en ophalen kunnen veroorloven.

Zie Gegevenscompressievoor meer informatie over compressie.

XML_COMPRESSION

van toepassing op: SQL Server 2022 (16.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance

Hiermee geeft u de XML-compressieoptie voor de opgegeven index die een of meer xml- kolommen van het gegevenstype bevat. De opties zijn als volgt:

  • OP

    Indexen of opgegeven partities worden gecomprimeerd met behulp van XML-compressie.

  • AF

    Indexen of opgegeven partities worden niet gecomprimeerd.

ON PARTITIONS ( { <partition_number_expression> | <bereik> } [ ,... n ] )

Hiermee geeft u de partities waarop de DATA_COMPRESSION of XML_COMPRESSION instellingen van toepassing zijn. Als de index niet is gepartitioneerd, genereert het argument ON PARTITIONS een fout. Als de ON PARTITIONS component niet is opgegeven, is de optie DATA_COMPRESSION of XML_COMPRESSION van toepassing op alle partities van een gepartitioneerde index.

<partition_number_expression> kunt u op de volgende manieren opgeven:

  • Geef het getal op voor een partitie, bijvoorbeeld: ON PARTITIONS (2).
  • Geef de partitienummers op voor verschillende afzonderlijke partities, gescheiden door komma's, bijvoorbeeld: ON PARTITIONS (1, 5).
  • Geef zowel bereiken als afzonderlijke partities op: ON PARTITIONS (2, 4, 6 TO 8).

<range> kan worden opgegeven als partitienummers gescheiden door het woord TO, bijvoorbeeld: ON PARTITIONS (6 TO 8).

Als u verschillende typen gegevenscompressie voor verschillende partities wilt instellen, geeft u de optie DATA_COMPRESSION meerdere keren op, bijvoorbeeld:

SQL
REBUILD WITH
(
DATA_COMPRESSION = NONE ON PARTITIONS (1),
DATA_COMPRESSION = ROW ON PARTITIONS (2, 4, 6 TO 8),
DATA_COMPRESSION = PAGE ON PARTITIONS (3, 5)
);

U kunt ook de optie XML_COMPRESSION meerdere keren opgeven, bijvoorbeeld:

SQL
REBUILD WITH
(
XML_COMPRESSION = OFF ON PARTITIONS (1),
XML_COMPRESSION = ON ON PARTITIONS (2, 4, 6 TO 8),
XML_COMPRESSION = OFF ON PARTITIONS (3, 5)
);

HERVATTEN

van toepassing op: SQL Server 2017 (14.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance

Hiermee wordt een indexbewerking hervat die handmatig is onderbroken, omdat de maximale duur is bereikt of vanwege een fout.

  • MAX_DURATION

    Hiermee geeft u op hoe lang, in minuten voor gehele getallen, een hervatbare indexbewerking wordt uitgevoerd nadat deze is hervat voordat deze opnieuw wordt onderbroken.

  • WAIT_AT_LOW_PRIORITY

    Hervatten van een indexbuildbewerking nadat een pauze de benodigde vergrendelingen moet verkrijgen. WAIT_AT_LOW_PRIORITY geeft aan dat de indexbuildbewerking vergrendelingen met lage prioriteit verkrijgt, waardoor andere bewerkingen kunnen worden voortgezet terwijl de indexbuildbewerking wacht. Het weglaten van de optie WAIT_AT_LOW_PRIORITY is gelijk aan WAIT_AT_LOW_PRIORITY (MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE). Zie WAIT_AT_LOW_PRIORITYvoor meer informatie.

PAUZEREN

van toepassing op: SQL Server 2017 (14.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance

Hiermee wordt een hervatbare indexbuildbewerking onderbroken.

ABORTEREN

van toepassing op: SQL Server 2017 (14.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance

Hiermee wordt een actieve of onderbroken indexbuildbewerking afgebroken die is gestart als hervatbaar. U moet expliciet een ABORT opdracht uitvoeren om een hervatbare indexbuildbewerking te beëindigen. Een fout of pauze in een hervatbare indexbewerking beëindigt de uitvoering ervan niet; in plaats daarvan blijft de bewerking in een onbeperkte onderbrekingsstatus.

Opmerkingen

ALTER INDEX kan niet worden gebruikt om een index opnieuw te partitioneren of naar een andere bestandsgroep te verplaatsen. Deze instructie kan niet worden gebruikt om de indexdefinitie te wijzigen, zoals het toevoegen of verwijderen van kolommen of het wijzigen van de kolomvolgorde. Gebruik CREATE INDEX met de DROP_EXISTING-component om deze bewerkingen uit te voeren.

Wanneer een optie niet expliciet wordt opgegeven, wordt de huidige instelling toegepast. Als bijvoorbeeld een FILLFACTOR instelling niet is opgegeven in de REBUILD component, wordt de waarde van de opvulfactor die is opgeslagen in de systeemcatalogus gebruikt tijdens het herbouwproces. Als u de huidige instellingen voor indexopties wilt weergeven, gebruikt u sys.indexes.

De waarden voor ONLINE, MAXDOPen SORT_IN_TEMPDB worden niet opgeslagen in de systeemcatalogus. Tenzij opgegeven in de indexinstructie, wordt de standaardwaarde voor de optie gebruikt.

Op computers met meerdere processors, net zoals bij andere query's, gebruikt ALTER INDEX REBUILD automatisch meer processors om de scan- en sorteerbewerkingen uit te voeren die zijn gekoppeld aan het wijzigen van de index. Omgekeerd is ALTER INDEX REORGANIZE één threadbewerking. Zie Parallelle indexbewerkingen configurerenvoor meer informatie.

In SQL Database in Microsoft Fabric wordt ALTER INDEX ALL niet ondersteund, maar ALTER INDEX <index name> wel.

Indexen opnieuw opbouwen

Als u een index opnieuw opbouwt, wordt de index opnieuw gemaakt. Hierdoor wordt fragmentatie verwijderd, wordt schijfruimte vrijgemaakt door de pagina's te comprimeren op basis van de opgegeven of bestaande instelling voor opvulfactor en worden de indexrijen in aaneengesloten pagina's opnieuw gerangschikt. Wanneer ALL is opgegeven, worden alle indexen in de tabel verwijderd en opnieuw opgebouwd in één transactie. Beperkingen voor refererende sleutels hoeven niet van tevoren te worden verwijderd. Wanneer indexen met 128 gebieden of meer opnieuw worden opgebouwd, worden de werkelijke toewijzingen van pagina-transacties en de bijbehorende vergrendelingen uitgesteld totdat de transactiedoorvoeringen zijn doorgevoerd. Zie Deferred deallocationvoor meer informatie.

Zie Indexonderhoud optimaliseren om de queryprestaties te verbeteren en het resourceverbruik te verminderenvoor meer informatie.

Indexen opnieuw ordenen

Het opnieuw ordenen van een index maakt gebruik van minimale systeemresources. Het defragmenteert het bladniveau van geclusterde en niet-geclusterde indexen in tabellen en weergaven door de volgorde van de pagina's op bladniveau fysiek te wijzigen zodat deze overeenkomen met de logische, van links naar rechtse volgorde van de leaf-knooppunten. Met het opnieuw ordenen van de indexpagina's worden ook de indexpagina's gecomprimeerd. Compressie is gebaseerd op de bestaande opvulfactorwaarde.

Wanneer ALL is opgegeven, worden relationele indexen, zowel geclusterde als niet-geclusterde indexen, en XML-indexen in de tabel opnieuw ingedeeld. Sommige beperkingen van toepassing bij het opgeven van ALL.

Zie Indexonderhoud optimaliseren om de queryprestaties te verbeteren en het resourceverbruik te verminderenvoor meer informatie.

Notitie

Voor een tabel met een geordende columnstore-index, ALTER INDEX REORGANIZE de gegevens niet opnieuw sorteert. Als u de gegevens wilt gebruiken, gebruikt u ALTER INDEX REBUILD.

Indexen uitschakelen

Als u een index uitschakelt, voorkomt u dat gebruikers toegang hebben tot de index en voor geclusterde indexen naar de onderliggende tabelgegevens. De indexdefinitie blijft aanwezig in de systeemcatalogus. Als u een niet-geclusterde index of geclusterde index uitschakelt in een weergave, worden de indexgegevens fysiek verwijderd. Als u een geclusterde index uitschakelt, wordt de toegang tot de gegevens geblokkeerd, maar blijven de gegevens onbevlekt in de B-boomstructuur totdat de index is verwijderd of opnieuw wordt opgebouwd. Als u wilt zien of een index is uitgeschakeld, gebruikt u de kolom is_disabled in de sys.indexes catalogusweergave.

Notitie

Documentatie maakt gebruik van de term B-tree in het algemeen in verwijzing naar indexen. In rijstore-indexen implementeert de database-engine een B+-structuur. Dit geldt niet voor columnstore-indexen of indexen voor tabellen die zijn geoptimaliseerd voor geheugen. Zie de SQL Server- en Azure SQL-indexarchitectuur en ontwerphandleidingvoor meer informatie.

Als een tabel zich in een transactionele replicatiepublicatie bevindt, kunt u een index die is gekoppeld aan een primaire-sleutelbeperking niet uitschakelen. Deze indexen zijn vereist voor replicatie. Als u een dergelijke index wilt uitschakelen, moet u eerst de tabel uit de publicatie verwijderen. Zie Gegevens en databaseobjecten publicerenvoor meer informatie.

Gebruik de ALTER INDEX REBUILD-instructie of de CREATE INDEX WITH DROP_EXISTING-instructie om de index in te schakelen. Het opnieuw samenstellen van een uitgeschakelde geclusterde index kan niet worden uitgevoerd met de optie ONLINE ingesteld op ON. Zie Indexen en beperkingen uitschakelenvoor meer informatie.

Opties instellen

U kunt de opties instellen ALLOW_ROW_LOCKS, ALLOW_PAGE_LOCKS, OPTIMIZE_FOR_SEQUENTIAL_KEY, IGNORE_DUP_KEYen STATISTICS_NORECOMPUTE voor een opgegeven index zonder de index opnieuw te bouwen of te herorganiseren. De gewijzigde waarden worden onmiddellijk toegepast op de index. Gebruik sys.indexesom deze instellingen weer te geven. Zie Indexopties instellenvoor meer informatie.

Opties voor rij- en paginavergrendelingen

Wanneer ALLOW_ROW_LOCKS = ON en ALLOW_PAGE_LOCK = ON, vergrendelingen op rijniveau, paginaniveau en tabelniveau zijn toegestaan wanneer u de index opent. De database-engine kiest de juiste vergrendeling en kan de vergrendeling van een rij- of paginavergrendeling escaleren naar een tabelvergrendeling.

Wanneer ALLOW_ROW_LOCKS = OFF en ALLOW_PAGE_LOCK = OFF, is alleen een vergrendeling op tabelniveau toegestaan wanneer u de index opent.

Als ALL wordt opgegeven wanneer de opties voor rij- of paginavergrendeling zijn ingesteld, worden de instellingen toegepast op alle indexen. Wanneer de onderliggende tabel een heap is, worden de instellingen op de volgende manieren toegepast:

Optie Van toepassing op
ALLOW_ROW_LOCKS = ON of OFF De heap en alle bijbehorende niet-geclusterde indexen.
ALLOW_PAGE_LOCKS = ON De heap en alle bijbehorende niet-geclusterde indexen.
ALLOW_PAGE_LOCKS = OFF De niet-geclusterde indexen, waarbij alle paginavergrendelingen niet zijn toegestaan. Voor de heap zijn alleen de gedeelde paginavergrendelingen (S), update (U) en exclusief (X) niet toegestaan. De database-engine kan nog steeds intentiepaginavergrendelingen (IS, IUof IX) verkrijgen voor interne doeleinden.

Waarschuwing

Het is niet raadzaam om rij- of paginavergrendelingen op een index uit te schakelen. Gelijktijdigheidsproblemen kunnen optreden en bepaalde functionaliteit is mogelijk niet beschikbaar. Een index kan bijvoorbeeld niet opnieuw worden geordend wanneer ALLOW_PAGE_LOCKS is ingesteld op OFF.

Online indexbewerkingen

Wanneer u een index opnieuw opbouwt en de optie ONLINE is ingesteld op ON, zijn gegevens in de index, de bijbehorende tabel en andere indexen in dezelfde tabel beschikbaar voor query's en aanpassingen. U kunt ook online een deel van een index herbouwen die zich op één partitie bevindt. Exclusieve tabelvergrendelingen worden slechts gedurende een korte tijd aan het einde van de index opnieuw opgebouwd.

Het herorganiseren van een index wordt altijd online uitgevoerd. Het proces bevat vergrendelingen gedurende korte tijd en is onwaarschijnlijk dat query's of updates worden geblokkeerd.

U kunt gelijktijdige online indexbewerkingen alleen uitvoeren op dezelfde tabel of tabelpartitie wanneer u de volgende bewerkingen uitvoert:

  • Meerdere niet-geclusterde indexen maken.
  • Verschillende indexen in dezelfde tabel opnieuw ordenen.
  • Verschillende indexen opnieuw ordenen tijdens het herbouwen van niet-overlappingsindexen in dezelfde tabel.

Alle andere online indexbewerkingen die tegelijkertijd worden uitgevoerd, mislukken. U kunt bijvoorbeeld niet twee of meer indexen tegelijk opnieuw opbouwen in dezelfde tabel of een nieuwe index maken tijdens het opnieuw opbouwen van een bestaande index in dezelfde tabel.

Zie Indexbewerkingen online uitvoerenvoor meer informatie.

Hervatbare indexbewerkingen

van toepassing op: SQL Server 2017 (14.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance

U kunt ervoor zorgen dat een online index opnieuw kan worden opgebouwd. Dit betekent dat het opnieuw opbouwen van de index kan worden gestopt en later opnieuw kan worden gestart vanaf het punt waar de index is gestopt. Als u een index opnieuw wilt opbouwen als hervat, geeft u de optie RESUMABLE = ON op.

De volgende richtlijnen zijn van toepassing op hervatbare indexbewerkingen:

  • Als u de optie RESUMABLE wilt gebruiken, moet u ook de optie ONLINE gebruiken.
  • De RESUMABLE optie wordt niet bewaard in de metagegevens voor een bepaalde index en is alleen van toepassing op de duur van de huidige DDL-instructie. Daarom moet de RESUMABLE = ON-component expliciet worden opgegeven om hervatting mogelijk te maken.
  • De optie MAX_DURATION kan in twee contexten worden opgegeven:
    • MAX_DURATION voor de optie RESUMABLE geeft het tijdsinterval op voor een index die wordt gemaakt. Na deze tijd is verstreken en als de indexbuild nog steeds wordt uitgevoerd, wordt deze onderbroken. U bepaalt wanneer de build voor een onderbroken index kan worden hervat. De tijd in minuten voor MAX_DURATION moet groter zijn dan 0 minuten en kleiner dan of gelijk aan één week (7 * 24 * 60 = 10080 minuten). Een lange pauze in een indexbewerking kan merkbaar van invloed zijn op de DML-prestaties op een specifieke tabel en de capaciteit van de databaseschijf, omdat zowel de oorspronkelijke index als de zojuist gemaakte index schijfruimte vereisen en moeten worden bijgewerkt door DML-bewerkingen. Als MAX_DURATION optie wordt weggelaten, wordt de indexbewerking voortgezet totdat deze is voltooid of totdat er een fout optreedt.
    • MAX_DURATION voor de optie WAIT_AT_LOW_PRIORITY geeft de tijd aan waarop moet worden gewacht met vergrendelingen met lage prioriteit als de indexbewerking wordt geblokkeerd, voordat u actie onderneemt. Zie WAIT_AT_LOW_PRIORITY met online indexbewerkingenvoor meer informatie.
  • Als u de indexbewerking onmiddellijk wilt onderbreken, kunt u de opdracht ALTER INDEX PAUSE uitvoeren of de opdracht KILL <session_id> uitvoeren.
  • Als u de oorspronkelijke ALTER INDEX REBUILD-instructie opnieuw uitvoert met dezelfde parameters, wordt de herbouwbewerking van de index hervat. U kunt ook een onderbroken herbouwbewerking voor index hervatten door de ALTER INDEX RESUME instructie uit te voeren.
  • Met de opdracht ABORT wordt de sessie met een indexbuild beëindigd en wordt de indexbewerking geannuleerd. U kunt een indexbewerking die is afgebroken niet hervatten.
  • Wanneer u een herbouwbewerking voor indexen hervat die is onderbroken, kunt u de MAXDOP waarde wijzigen in een nieuwe waarde. Als MAXDOP niet is opgegeven bij het hervatten van een indexbewerking die is onderbroken, wordt de MAXDOP waarde gebruikt die wordt gebruikt voor het laatste cv. Als de optie MAXDOP helemaal niet is opgegeven voor een herbouwbewerking voor indexen, wordt de standaardwaarde gebruikt.

Een hervatbare indexbewerking wordt uitgevoerd totdat deze is voltooid, onderbreekt of mislukt. Als de bewerking wordt onderbroken, wordt er een fout weergegeven die aangeeft dat de bewerking is onderbroken en dat het opnieuw opbouwen van de index niet is voltooid. Als de bewerking mislukt, wordt er ook een fout uitgegeven.

Als u wilt zien of een indexbewerking wordt uitgevoerd als een hervatbare bewerking en om de huidige uitvoeringsstatus te controleren, gebruikt u de sys.index_resumable_operations catalogusweergave.

Weg

De volgende resources zijn vereist voor hervatbare indexbewerkingen:

  • Extra ruimte die nodig is om de index te laten bouwen, inclusief de tijd waarop de build wordt onderbroken.
  • Extra logboekdoorvoer tijdens de sorteerfase. Het totale gebruik van logboekruimte voor hervatbare indexen is minder in vergelijking met normale online index opnieuw opbouwen en maakt afkapping van logboeken mogelijk tijdens deze bewerking.
  • DDL-instructies voor het wijzigen van een index die wordt herbouwd of de bijbehorende tabel terwijl de indexbewerking is onderbroken, zijn niet toegestaan.
  • Ghost-opschoning wordt geblokkeerd voor de in-build-index voor de duur van de bewerking, zowel tijdens onderbroken als terwijl de bewerking wordt uitgevoerd.
  • Als de tabel LOB-kolommen bevat, is voor een hervatbare geclusterde indexbuild een schemawijziging (Sch-M) vereist aan het begin van de bewerking.

Huidige functionele beperkingen

Hervatbare bewerkingen voor het opnieuw opbouwen van indexen hebben de volgende beperkingen:

  • De optie SORT_IN_TEMPDB = ON wordt niet ondersteund voor hervatbare indexbewerkingen.
  • De DDL-opdracht met RESUMABLE = ON kan niet worden uitgevoerd binnen een expliciete transactie.
  • U kunt geen hervatbare index maken die het volgende bevat:
    • Berekend of tijdstempel/rowversion kolommen als sleutelkolommen.
    • LOB-kolom als een opgenomen kolom.
  • Hervatbare indexbewerkingen worden niet ondersteund voor:
    • De opdracht ALTER INDEX REBUILD ALL
    • De opdracht ALTER TABLE REBUILD
    • Columnstore-indexen
    • Gefilterde indexen
    • Uitgeschakelde indexen

WAIT_AT_LOW_PRIORITY met online indexbewerkingen

van toepassing op: SQL Server 2014 (12.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance

Wanneer u de optie WAIT_AT_LOW_PRIORITY niet gebruikt, moeten alle actieve blokkerende transacties die vergrendelingen in de tabel of index bevatten, worden voltooid voordat de herbouwbewerking van de index wordt gestart en voltooid. Wanneer de online indexbewerking wordt gestart en voordat deze is voltooid, moet deze een gedeelde (S) of een schemawijziging (Sch-M) in de tabel verkrijgen en deze gedurende korte tijd bewaren. Hoewel de vergrendeling slechts korte tijd wordt bewaard, kan dit van invloed zijn op de doorvoer van de werkbelasting, de querylatentie verhogen of time-outs voor de uitvoering veroorzaken.

Om deze problemen te voorkomen, kunt u met de WAIT_AT_LOW_PRIORITY optie het gedrag van S of Sch-M vergrendelingen beheren die nodig zijn om een online indexbewerking te starten en te voltooien, waarbij u uit drie opties kunt kiezen. In alle gevallen, als er tijdens de wachttijd die is opgegeven door MAX_DURATION = n [minutes] er geen blokkering is die betrekking heeft op de indexbewerking, wordt de indexbewerking onmiddellijk uitgevoerd.

WAIT_AT_LOW_PRIORITY maakt de online indexbewerking wachten met vergrendelingen met lage prioriteit, zodat andere bewerkingen met normale prioriteitsvergrendelingen ondertussen kunnen doorgaan. Het weglaten van de optie WAIT_AT_LOW_PRIORITY is gelijk aan WAIT_AT_LOW_PRIORITY (MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).

MAX_DURATION = tijd [MINUTES]

De wachttijd (een geheel getal dat is opgegeven in minuten) die de onlineindexbewerking wacht met vergrendelingen met lage prioriteit. Als de bewerking wordt geblokkeerd voor de MAX_DURATION tijd, wordt de opgegeven ABORT_AFTER_WAIT actie uitgevoerd. MAX_DURATION tijd is altijd in minuten en het woord MINUTES kan worden weggelaten.

ABORT_AFTER_WAIT = [NONE | SELF | BLOCKERS ]

  • NONE: Blijf wachten op de vergrendeling met de normale prioriteit.
  • SELF: Sluit de onlineindexbewerking die momenteel wordt uitgevoerd, zonder actie te ondernemen. De optie SELF kan niet worden gebruikt wanneer MAX_DURATION 0 is.
  • BLOCKERS: alle gebruikerstransacties beëindigen die de onlineindexbewerking blokkeren, zodat de bewerking kan worden voortgezet. Voor de optie BLOCKERS moet de principal de CREATE INDEX- of ALTER INDEX-instructie uitvoeren om de machtiging ALTER ANY CONNECTION te hebben.

U kunt de volgende uitgebreide gebeurtenissen gebruiken om indexbewerkingen te bewaken die wachten op vergrendelingen met een lage prioriteit:

  • lock_request_priority_state
  • process_killed_by_abort_blockers
  • ddl_with_wait_at_low_priority

Beperkingen voor ruimtelijke index

Wanneer u een ruimtelijke index opnieuw bouwt, is de onderliggende gebruikerstabel niet beschikbaar tijdens de indexbewerking.

De PRIMARY KEY beperking in de gebruikerstabel kan niet worden gewijzigd terwijl een ruimtelijke index is gedefinieerd in een kolom van die tabel. Als u de beperking PRIMARY KEY wilt wijzigen, zet u eerst elke ruimtelijke index van de tabel neer. Nadat u de PRIMARY KEY beperking hebt gewijzigd, kunt u elk van de ruimtelijke indexen opnieuw maken.

In één bewerking voor het opnieuw opbouwen van partities kunt u geen ruimtelijke indexen opgeven. U kunt echter ruimtelijke indexen opgeven in een tabel opnieuw samenstellen.

Als u opties wilt wijzigen die specifiek zijn voor een ruimtelijke index, zoals BOUNDING_BOX of GRID, kunt u een CREATE SPATIAL INDEX-instructie gebruiken waarmee DROP_EXISTING = ONwordt opgegeven, of de ruimtelijke index verwijderen en een nieuwe index maken. Zie CREATE SPATIAL INDEXvoor een voorbeeld.

Gegevenscompressie

Zie Gegevenscompressievoor meer informatie over gegevenscompressie.

Hier volgen de belangrijkste aandachtspunten in de context van indexbuildbewerkingen wanneer gegevenscompressie wordt gebruikt:

  • Met compressie kunnen meer rijen op een pagina worden opgeslagen, maar wordt de maximale rijgrootte niet gewijzigd.
  • Niet-bladpagina's van een index zijn niet gecomprimeerde pagina's, maar kunnen wel worden gecomprimeerd.
  • Elke niet-geclusterde index heeft een afzonderlijke compressie-instelling en neemt de compressie-instelling van de onderliggende tabel niet over.
  • Wanneer een geclusterde index wordt gemaakt op een heap, neemt de geclusterde index de compressiestatus van de heap over, tenzij een alternatieve compressiestatus is opgegeven.

De volgende overwegingen zijn van toepassing op het opnieuw samenstellen van gepartitioneerde indexen:

  • U kunt de compressie-instelling van één partitie niet wijzigen als de tabel niet-uitgelijnde indexen heeft.
  • De ALTER INDEX <index> ... REBUILD PARTITION ... WITH DATA_COMPRESSION = ... syntaxis herbouwt de opgegeven partitie van de index met de opgegeven compressieoptie. Als de WITH DATA_COMPRESSION component wordt weggelaten, wordt de bestaande compressieoptie gebruikt.
  • De ALTER INDEX <index> ... REBUILD PARTITION = ALL syntaxis herbouwt alle partities van de index met behulp van de bestaande compressieopties.
  • De ALTER INDEX <index> ... REBUILD PARTITION = ALL (WITH ...) syntaxis herbouwt alle partities van de index. U kunt verschillende compressies kiezen voor verschillende partities met behulp van de DATA_COMPRESSION = ... ON PARTITIONS ( ...) component.

Als u wilt evalueren hoe het wijzigen van PAGE en ROW compressie van invloed is op een tabel, een index of een partitie, gebruikt u de sp_estimate_data_compression_savings opgeslagen procedure.

Statistiek

Wanneer u een index opnieuw bouwt, worden de statistieken op de index bijgewerkt met volledige scan op niet-gepartitioneerde indexen en met de standaardsamplingverhouding voor gepartitioneerde indexen. Er worden geen andere statistieken in de tabel bijgewerkt als onderdeel van het opnieuw samenstellen van de index.

Machtigingen

De ALTER machtiging voor de tabel of weergave is vereist.

Versieopmerkingen

  • Azure SQL Database biedt geen ondersteuning voor bestandsgroepen anders dan PRIMARY.
  • Azure SQL Database en Azure SQL Managed Instance bieden geen ondersteuning voor FILESTREAM opties.
  • Columnstore-indexen zijn niet beschikbaar vóór SQL Server 2012 (11.x).
  • Hervatbare indexbewerkingen zijn beschikbaar in SQL Server 2017 (14.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance.

Voorbeeld van basissyntaxis

SQL
ALTER INDEX index1 ON table1 REBUILD;
ALTER INDEX ALL ON table1 REBUILD;
ALTER INDEX ALL ON dbo.table1 REBUILD;

Voorbeelden: Columnstore-indexen

Deze voorbeelden zijn van toepassing op columnstore-indexen.

Een. Demo OPNIEUW ORGANISEREN

In dit voorbeeld ziet u hoe de opdracht ALTER INDEX REORGANIZE werkt. Er wordt een tabel gemaakt die meerdere rijgroepen bevat en laat vervolgens zien hoe REORGANIZE de rijgroepen samenvoegt.

SQL
-- Create a database
CREATE DATABASE [columnstore];
GO

-- Create a rowstore staging table
CREATE TABLE [staging] (
    AccountKey INT NOT NULL,
    AccountDescription NVARCHAR(50),
    AccountType NVARCHAR(50),
    AccountCodeAlternateKey INT
);

-- Insert 10 million rows into the staging table.
DECLARE @loop INT;
DECLARE @AccountDescription VARCHAR(50);
DECLARE @AccountKey INT;
DECLARE @AccountType VARCHAR(50);
DECLARE @AccountCode INT;

SELECT @loop = 0

BEGIN TRANSACTION

WHILE (@loop < 300000)
BEGIN
    SELECT @AccountKey = CAST(RAND() * 10000000 AS INT);
    SELECT @AccountDescription = 'accountdesc ' + CONVERT(VARCHAR(20), @AccountKey);
    SELECT @AccountType = 'AccountType ' + CONVERT(VARCHAR(20), @AccountKey);
    SELECT @AccountCode = CAST(RAND() * 10000000 AS INT);

    INSERT INTO staging
    VALUES (
        @AccountKey,
        @AccountDescription,
        @AccountType,
        @AccountCode
     );

    SELECT @loop = @loop + 1;
END

COMMIT

-- Create a table for the clustered columnstore index
CREATE TABLE cci_target (
    AccountKey INT NOT NULL,
    AccountDescription NVARCHAR(50),
    AccountType NVARCHAR(50),
    AccountCodeAlternateKey INT
);

-- Convert the table to a clustered columnstore index named inxcci_cci_target;
CREATE CLUSTERED COLUMNSTORE INDEX idxcci_cci_target ON cci_target;

Gebruik de tablock-optie om rijen parallel in te voegen. Vanaf SQL Server 2016 (13.x) kan de INSERT INTO-bewerking parallel worden uitgevoerd wanneer TABLOCK wordt gebruikt.

SQL
INSERT INTO cci_target WITH (TABLOCK)
SELECT TOP 300000 * FROM staging;

Voer deze opdracht uit om de OPEN deltarijgroepen te zien. Het aantal rijengroepen is afhankelijk van de mate van parallelle uitvoering.

SQL
SELECT *
FROM sys.dm_db_column_store_row_group_physical_stats
WHERE object_id  = object_id('cci_target');

Voer deze opdracht uit om alle CLOSED en OPEN rijengroepen af te dwingen in de columnstore.

SQL
ALTER INDEX idxcci_cci_target ON cci_target REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);

Voer deze opdracht opnieuw uit en u ziet dat kleinere rijengroepen worden samengevoegd in één gecomprimeerde rijgroep.

SQL
ALTER INDEX idxcci_cci_target ON cci_target REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);

B. GESLOTEN deltarijgroepen comprimeren in de columnstore

In dit voorbeeld wordt de optie REORGANIZE gebruikt om elke CLOSED deltarijgroep te comprimeren in de columnstore als een gecomprimeerde rijgroep. Dit is niet nodig, maar is handig wanneer de tuple-mover niet snel genoeg CLOSED rijgroepen comprimeert.

U kunt beide voorbeelden uitvoeren in de AdventureWorksDW2022 voorbeelddatabase.

In dit voorbeeld wordt REORGANIZE uitgevoerd op alle partities.

SQL
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE;

In dit voorbeeld wordt REORGANIZE uitgevoerd op een specifieke partitie.

SQL
-- REORGANIZE a specific partition
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE PARTITION = 0;

C. Alle OPEN EN GESLOTEN deltarijgroepen comprimeren in de columnstore

van toepassing op: SQL Server 2016 (13.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance

Met de opdracht REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON) elke OPEN comprimeert en CLOSED deltarijgroep in de columnstore als een gecomprimeerde rijgroep. Hierdoor wordt de deltastore geleegd en worden alle rijen gecomprimeerd in de columnstore. Dit is vooral handig nadat u veel invoegbewerkingen hebt uitgevoerd, omdat deze bewerkingen de rijen opslaan in een of meer deltarijgroepen.

REORGANIZE combineert rijgroepen om rijgroepen te vullen tot een maximum aantal rijen <= 1.024.576. Dus wanneer u alle OPEN en CLOSED rijgroepen comprimeert, eindigt u niet met veel gecomprimeerde rijgroepen die er maar een paar rijen in hebben. U wilt dat rijgroepen zo vol mogelijk zijn om de gecomprimeerde grootte te verminderen en de queryprestaties te verbeteren.

In de volgende voorbeelden wordt de AdventureWorksDW2022-database gebruikt.

In dit voorbeeld worden alle OPEN en CLOSED deltarijgroepen verplaatst naar de columnstore-index.

SQL
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);

In dit voorbeeld worden alle OPEN en CLOSED deltarijgroepen verplaatst naar de columnstore-index voor een specifieke partitie.

SQL
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE PARTITION = 0 WITH (COMPRESS_ALL_ROW_GROUPS = ON);

D. Een columnstore-index online defragmenteren

is niet van toepassing op: SQL Server 2012 (11.x) en SQL Server 2014 (12.x).

Vanaf SQL Server 2016 (13.x) doet REORGANIZE meer dan deltarijgroepen comprimeren in de columnstore. Het voert ook online defragmentatie uit. Ten eerste verkleint het de kolomopslag door fysiek verwijderde rijen te verwijderen wanneer 10% of meer van de rijen in een rijgroep zijn verwijderd. Vervolgens worden rijengroepen gecombineerd om grotere rijgroepen te vormen met maximaal 1024.576 rijen per rijgroep. Alle rijengroepen die worden gewijzigd, worden opnieuw gecomprimeerd.

Notitie

Vanaf SQL Server 2016 (13.x) is het opnieuw opbouwen van een columnstore-index niet meer nodig in de meeste situaties, omdat REORGANIZE fysiek verwijderde rijen verwijdert en rijgroepen samenvoegt. De optie COMPRESS_ALL_ROW_GROUPS dwingt alle OPEN of CLOSED deltarijgroepen af in de columnstore die eerder alleen kon worden uitgevoerd met een herbouwing. REORGANIZE online is en op de achtergrond plaatsvindt, zodat query's kunnen worden voortgezet wanneer de bewerking plaatsvindt.

In het volgende voorbeeld wordt een REORGANIZE uitgevoerd om de index te defragmenteren door rijen die logisch uit de tabel zijn verwijderd, fysiek te verwijderen en rijgroepen samen te voegen.

SQL
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE;

E. Een geclusterde columnstore-index offline herbouwen

Van toepassing op: SQL Server, Azure SQL Database en Azure SQL Managed Instance

Tip

Vanaf SQL Server 2016 (13.x) en in Azure SQL Database raden we u aan om ALTER INDEX REORGANIZE te gebruiken in plaats van ALTER INDEX REBUILD voor columnstore-indexen.

Notitie

In SQL Server 2012 (11.x) en SQL Server 2014 (12.x) wordt REORGANIZE alleen gebruikt om CLOSED rijengroepen te comprimeren in de columnstore. De enige manier om de fragmentatiebewerkingen uit te voeren en alle deltarijgroepen in de columnstore af te dwingen, is door de index opnieuw te bouwen.

In dit voorbeeld ziet u hoe u een geclusterde columnstore-index herbouwt en alle deltarijgroepen forceert in de columnstore. In deze eerste stap wordt een tabel FactInternetSales2 in de AdventureWorksDW2022-database voorbereid met een geclusterde columnstore-index en worden gegevens uit de eerste vier kolommen ingevoegd.

SQL
CREATE TABLE dbo.FactInternetSales2 (
    ProductKey [int] NOT NULL,
    OrderDateKey [int] NOT NULL,
    DueDateKey [int] NOT NULL,
    ShipDateKey [int] NOT NULL);

CREATE CLUSTERED COLUMNSTORE INDEX cci_FactInternetSales2
ON dbo.FactInternetSales2;

INSERT INTO dbo.FactInternetSales2
SELECT ProductKey, OrderDateKey, DueDateKey, ShipDateKey
FROM dbo.FactInternetSales;

SELECT * FROM sys.column_store_row_groups;

In de resultaten wordt één OPEN rijgroep weergegeven, wat betekent dat SQL Server wacht tot er meer rijen worden toegevoegd voordat de rijgroep wordt gesloten en de gegevens naar de columnstore worden verplaatst. Met deze volgende instructie wordt de geclusterde columnstore-index opnieuw opgebouwd, waardoor alle rijen in de columnstore worden gedwongen.

SQL
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REBUILD;
SELECT * FROM sys.column_store_row_groups;

De resultaten van de instructie SELECT geven aan dat de rijgroep is COMPRESSED, wat betekent dat de kolomsegmenten van de rijgroep nu worden gecomprimeerd en opgeslagen in de columnstore.

F. Een partitie van een geclusterde columnstore-index offline herbouwen

van toepassing op: SQL Server 2012 (11.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance

Als u een partitie van een grote geclusterde columnstore-index opnieuw wilt opbouwen, gebruikt u ALTER INDEX REBUILD met de partitieoptie. In dit voorbeeld wordt partitie 12 opnieuw opgebouwd. Vanaf SQL Server 2016 (13.x) raden we u aan om REBUILD te vervangen door REORGANIZE.

SQL
ALTER INDEX cci_fact3
ON fact3
REBUILD PARTITION = 12;

G. Een geclusterde columnstore-index wijzigen om archiveringscompressie te gebruiken

is niet van toepassing op: SQL Server 2012 (11.x)

U kunt ervoor kiezen om de grootte van een geclusterde columnstore-index nog verder te verkleinen met behulp van de optie COLUMNSTORE_ARCHIVE gegevenscompressie. Dit is praktisch voor oudere gegevens die u goedkopere opslag wilt behouden. We raden u aan dit alleen te gebruiken op gegevens die niet vaak worden geopend, omdat decomprimeren langzamer is dan met de normale COLUMNSTORE compressie.

In het volgende voorbeeld wordt een geclusterde columnstore-index opnieuw opgebouwd om archiveringscompressie te gebruiken en ziet u vervolgens hoe u de archiveringscompressie verwijdert. Het uiteindelijke resultaat maakt alleen gebruik van columnstore-compressie.

Bereid eerst het voorbeeld voor door een tabel te maken met een geclusterde columnstore-index. Comprimeer vervolgens de tabel verder met archiveringscompressie.

SQL
--Prepare the example by creating a table with a clustered columnstore index.
CREATE TABLE SimpleTable (
    ProductKey [int] NOT NULL,
    OrderDateKey [int] NOT NULL,
    DueDateKey [int] NOT NULL,
    ShipDateKey [int] NOT NULL
);

CREATE CLUSTERED INDEX cci_SimpleTable ON SimpleTable (ProductKey);

CREATE CLUSTERED COLUMNSTORE INDEX cci_SimpleTable
ON SimpleTable
WITH (DROP_EXISTING = ON);

--Compress the table further by using archival compression.
ALTER INDEX cci_SimpleTable ON SimpleTable
REBUILD
WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE);
GO

In dit voorbeeld wordt de archiefcompressie verwijderd en wordt alleen gebruikgemaakt van columnstore-compressie.

SQL
ALTER INDEX cci_SimpleTable ON SimpleTable
REBUILD
WITH (DATA_COMPRESSION = COLUMNSTORE);
GO

Voorbeelden: Rowstore-indexen

Een. Een index opnieuw samenstellen

In het volgende voorbeeld wordt één index in de Employee tabel in de AdventureWorks2022-database opnieuw opgebouwd.

SQL
ALTER INDEX PK_Employee_EmployeeID ON HumanResources.Employee REBUILD;

B. Alle indexen in een tabel opnieuw samenstellen en opties opgeven

In het volgende voorbeeld wordt het trefwoord ALLopgegeven. Hiermee worden alle indexen herbouwd die zijn gekoppeld aan de tabel Production.Product in de AdventureWorks2022-database. Er worden drie opties opgegeven.

SQL
ALTER INDEX ALL ON Production.Product
REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = ON);

In het volgende voorbeeld wordt de optie ONLINE toegevoegd, inclusief de optie vergrendelen met lage prioriteit, en wordt de optie voor rijcompressie toegevoegd.

van toepassing op: SQL Server 2014 (12.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance

SQL
ALTER INDEX ALL ON Production.Product
REBUILD WITH
(
    FILLFACTOR = 80,
    SORT_IN_TEMPDB = ON,
    STATISTICS_NORECOMPUTE = ON,
    ONLINE = ON ( WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 4 MINUTES, ABORT_AFTER_WAIT = BLOCKERS ) ),
    DATA_COMPRESSION = ROW
);

C. Een index opnieuw organiseren met LOB-compressie

In het volgende voorbeeld wordt één geclusterde index in de AdventureWorks2022-database opnieuw georganiseerd. Omdat de index een LOB-gegevenstype in het bladbladniveau bevat, worden met de instructie ook alle pagina's gecomprimeerd die de grote objectgegevens bevatten. Het opgeven van de optie WITH (LOB_COMPACTION = ON) is niet vereist omdat de standaardwaarde IS INGESCHAKELD.

SQL
ALTER INDEX PK_ProductPhoto_ProductPhotoID ON Production.ProductPhoto REORGANIZE WITH (LOB_COMPACTION = ON);

D. Opties instellen voor een index

In het volgende voorbeeld worden verschillende opties ingesteld voor de index AK_SalesOrderHeader_SalesOrderNumber in de AdventureWorks2022-database.

SQL
ALTER INDEX AK_SalesOrderHeader_SalesOrderNumber ON
    Sales.SalesOrderHeader
SET (
    STATISTICS_NORECOMPUTE = ON,
    IGNORE_DUP_KEY = ON,
    ALLOW_PAGE_LOCKS = ON
    ) ;
GO

E. Een index uitschakelen

In het volgende voorbeeld wordt een niet-geclusterde index in de Employee tabel in de AdventureWorks2022-database uitgeschakeld.

SQL
ALTER INDEX IX_Employee_ManagerID ON HumanResources.Employee DISABLE;

F. Beperkingen uitschakelen

In het volgende voorbeeld wordt een PRIMARY KEY beperking uitgeschakeld door de PRIMARY KEY index in de AdventureWorks2022-database uit te schakelen. De FOREIGN KEY beperking voor de onderliggende tabel wordt automatisch uitgeschakeld en er wordt een waarschuwingsbericht weergegeven.

SQL
ALTER INDEX PK_Department_DepartmentID ON HumanResources.Department DISABLE;

De resultatenset retourneert dit waarschuwingsbericht.

Output
Warning: Foreign key 'FK_EmployeeDepartmentHistory_Department_DepartmentID'
on table 'EmployeeDepartmentHistory' referencing table 'Department'
was disabled as a result of disabling the index 'PK_Department_DepartmentID'.

G. Beperkingen inschakelen

In het volgende voorbeeld worden de beperkingen PRIMARY KEY en FOREIGN KEY ingeschakeld die zijn uitgeschakeld in voorbeeld F.

De beperking PRIMARY KEY is ingeschakeld door de PRIMARY KEY index opnieuw te bouwen.

SQL
ALTER INDEX PK_Department_DepartmentID ON HumanResources.Department REBUILD;

De FOREIGN KEY beperking wordt vervolgens ingeschakeld.

SQL
ALTER TABLE HumanResources.EmployeeDepartmentHistory
CHECK CONSTRAINT FK_EmployeeDepartmentHistory_Department_DepartmentID;
GO

H. Een gepartitioneerde index opnieuw bouwen

In het volgende voorbeeld wordt één partitie, het partitienummer 5, van de gepartitioneerde index IX_TransactionHistory_TransactionDate in de AdventureWorks2022-database opnieuw opgebouwd. Partitie 5 wordt opnieuw opgebouwd met ONLINE=ON en de wachttijd van 10 minuten voor de vergrendeling met lage prioriteit wordt afzonderlijk toegepast op elke vergrendeling die is verkregen door de bewerking voor het opnieuw opbouwen van de index. Als de vergrendeling gedurende deze periode niet kan worden verkregen om het opnieuw opbouwen van de index te voltooien, wordt de instructie voor herbouwen zelf afgebroken vanwege ABORT_AFTER_WAIT = SELF.

van toepassing op: SQL Server 2014 (12.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance

SQL
-- Verify the partitioned indexes.
SELECT *
FROM sys.dm_db_index_physical_stats (DB_ID(),OBJECT_ID(N'Production.TransactionHistory'), NULL , NULL, NULL);
GO
--Rebuild only partition 5.
ALTER INDEX IX_TransactionHistory_TransactionDate
ON Production.TransactionHistory
REBUILD Partition = 5
   WITH (ONLINE = ON (WAIT_AT_LOW_PRIORITY (MAX_DURATION = 10 minutes, ABORT_AFTER_WAIT = SELF)));
GO

Ik. De compressie-instelling van een index wijzigen

In het volgende voorbeeld wordt een index opnieuw opgebouwd voor een niet-gepartitioneerde rowstore-tabel.

SQL
ALTER INDEX IX_INDEX1
ON T1
REBUILD
WITH (DATA_COMPRESSION = PAGE);
GO

J. De instelling van een index wijzigen met XML-compressie

van toepassing op: SQL Server 2022 (16.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance.

In het volgende voorbeeld wordt een index opnieuw opgebouwd voor een niet-gepartitioneerde rowstore-tabel.

SQL
ALTER INDEX IX_INDEX1
ON T1
REBUILD
WITH (XML_COMPRESSION = ON);
GO

Zie Gegevenscompressievoor meer voorbeelden van gegevenscompressie.

K. Online hervatbare index herbouwen

van toepassing op: SQL Server 2017 (14.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance

In de volgende voorbeelden ziet u hoe u online hervatbare indexrebouw kunt gebruiken.

Voer een online index opnieuw opbouwen uit als hervatbare bewerking met MAXDOP = 1. Als u dezelfde opdracht opnieuw uitvoert nadat een indexbewerking is onderbroken, wordt de herbouwbewerking van de index automatisch hervat.

SQL
ALTER INDEX test_idx on test_table REBUILD WITH (ONLINE = ON, MAXDOP = 1, RESUMABLE = ON);

Voer een online index opnieuw opbouwen uit als hervatbare bewerking met MAX_DURATION ingesteld op 240 minuten.

SQL
ALTER INDEX test_idx on test_table REBUILD WITH (ONLINE = ON, RESUMABLE = ON, MAX_DURATION = 240);

Pauzeer een actieve, hervatbare online index opnieuw opbouwen.

SQL
ALTER INDEX test_idx on test_table PAUSE;

Hervatten van het opnieuw samenstellen van een online index voor een herbouw van een index die is uitgevoerd als hervatbare bewerking die een nieuwe waarde voor MAXDOP ingesteld op 4.

SQL
ALTER INDEX test_idx on test_table RESUME WITH (MAXDOP = 4);

Hervat een online herbouwbewerking voor indexen voor een online herbouwbewerking van een index die is uitgevoerd als hervatbaar. Stel MAXDOP in op 2, stel de uitvoeringstijd in voor de index die wordt uitgevoerd als hervatbaar tot 240 minuten en als een index wordt geblokkeerd op de vergrendeling, wacht u 10 minuten en daarna worden alle blokkeringen gedood.

SQL
ALTER INDEX test_idx on test_table
    RESUME WITH (MAXDOP = 2, MAX_DURATION = 240 MINUTES,
    WAIT_AT_LOW_PRIORITY (MAX_DURATION = 10, ABORT_AFTER_WAIT = BLOCKERS));

Herbouwbewerking van hervatbare index afbreken die wordt uitgevoerd of onderbroken.

SQL
ALTER INDEX test_idx on test_table ABORT;