sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server Resumable Index:Er det godt for dig?

SQL 2017 introducerede muligheden for at pause og genoptage indeksgenopbygningsoperationer under databasevedligeholdelse. Denne funktion giver databaseadministratorer mere fleksibilitet, da den giver dem mulighed for at vælge mellem offline- og onlinegenindeksering samt pause og genoptagelse af genopbygningen af ​​indekset, når det er nødvendigt.

Før udgivelsen af ​​det genoptagelige indeks kunne databaseadministratorer udføre indeksgenopbygning offline og online .

Offline tilbyder hurtigere eksekvering, da tabellen er låst til enhver læsning eller skriv drift, og det nye indeks er bygget ud fra det gamle indeks. Under denne proces er ingen læse- eller skrivehandlinger tilladt. Når handlingen er udført, udløses bordlåsen, og læse- og skrivehandlinger tillades igen. Offline mulighed er naturligvis hurtigere.

Online holder tabellen åben til læsning og skriv operationer. Der er lavet endnu en kopi af indekset, og alle indeksgenopbygningsoperationer er i denne kopi. Alle nye rækkeoperationer skrives til begge indekser. Når genopbygningen er fuldført, er skiftet udført, og den nye indekskopi tages i brug. Online rebuild giver mulighed for genopbygningsoperationer, mens databasen er online. Nedetiden er minimal.

Bemærk, at funktionen til genoptagelig indeks kun er tilgængelig i SQL Server Enterprise-udgaven og den gratis Developer-udgave. Hvis du har denne mulighed på bordet, kan du lege med den, lave en simpel test og se, om denne funktion er nyttig i dit tilfælde.

Microsoft-dokumentationen angiver følgende aspekter for dine overvejelser:

  • Du kan administrere, planlægge og udvide indeksvedligeholdelsesvinduer. Du kan pause og genstarte indeksoprettelse eller genopbygning, når du skal tilpasse dine vedligeholdelsesvinduer.
  • Du kan gendanne fra indekset oprette eller genopbygge fejl (såsom database-failovers eller løbe tør for diskplads).
  • Vær opmærksom på, at når en indekshandling er sat på pause, vil både det originale indeks og det nyoprettede kræve diskplads. Du bliver nødt til at opdatere dem under DML-operationerne.
  • Du kan aktivere trunkering af transaktionslogfiler under indeksoprettelse eller genopbygning.
  • Bemærk, at SORT_IN_TEMPDB=ON-indstillingen ikke understøttes

Lad os teste genopbygningen af ​​indekset. Jeg vil bruge et containerbillede, der kører SQL 2019 Server Developer edition. Jeg vil også oprette en lille tabel med kun et par kolonner og indsætte omkring en million rækker i den tabel. Du kan få bordet til at vokse sig større med flere rækker.

Da jeg bruger en Linux-maskine og ikke kan installere SQL Server Management Studio, bruger jeg Azure Data Studio-klienten til at oprette forbindelse til min SQL Server. Tag et kig på skærmbilledet af mine SQL Server-egenskaber:

Vi opretter en eksempeldatabase, en tabel og et indeks med nedenstående T-SQL-scripts. Du kan udføre dem fejlfrit med SSMS eller dbForge Studio til SQL Server:

-- Create a new database called 'DatabaseName' 
-- Connect to the 'master' database to run this snippet 
USE master 
GO 
-- Create the new database if it does not exist already 
IF NOT EXISTS ( 
SELECT [name] 
FROM sys.databases 
WHERE [name] = N'dbatools' 
) 
CREATE DATABASE dbatools 
GO
Use dbatools 

-- Create a new table called '[TableName]' in schema '[dbo]' 
-- Drop the table if it already exists 
IF OBJECT_ID('[dbo].[TabletoIndex]', 'U') IS NOT NULL 
DROP TABLE [dbo].[TabletoIndex] 
GO 
-- Create the table in the specified schema 
CREATE TABLE [dbo].[TabletoIndex] 
( 
[Id] INT NOT NULL PRIMARY KEY, -- Primary Key column 
[ColumnName1] NVARCHAR(50) NOT NULL 
-- Specify more columns here 
); 
GO 

 

For at udfylde tabellen med tilfældige data skal du udføre nedenstående script:

--populate the table SET NOCOUNT ON Declare @Id int Set @Id = 1 While @Id <= 1000000 Begin Insert Into TabletoIndex values (@Id, 'Name - ' + CAST(@Id as nvarchar(10))) Set @Id = @Id + 1 End SELECT count(*) from TabletoIndex

Med en udfyldt tabel klar kan vi fortsætte til det genoptagelige indeks. Lad os starte med at oprette det indeks:

-- Create a nonclustered index with or without a unique constraint -- Or create a clustered index on table '[TableName]' in schema '[dbo]' in database '[DatabaseName]' 
CREATE UNIQUE INDEX IX_ID_Name ON [dbo].[TabletoIndex] (ID desc, [ColumnName1] DESC) WITH (SORT_IN_TEMPDB = OFF, RESUMABLE=ON, ONLINE = ON, MAX_DURATION=1) GO
 

Bemærk nye muligheder/parametre i ovenstående kommando. RESUMABLE=ON betyder, at vi ønsker at have en genoptagelig indeksoperation. Max_Duration er værdien i minutter, der definerer, hvor længe vi ønsker, at indeksering skal køre.

Mens ovenstående kommando kører, skal du åbne en anden session og udføre T-SQL-kommandoen nedenfor for at PAUSE den igangværende genopbygningsaktivitet:

--Rebuild WITH RESUMABLE functionality 
ALTER INDEX IX_ID_Name ON [dbo].[TabletoIndex] PAUSE 
GO 
 

Hvis PAUSE kommandoen er vellykket, pauser vi den aktuelle indekseringsoperation, der startede for cirka et minut siden. Men når du går tilbage til den forrige session for genopbygningskommandoen med resumable=ON , returnerer den en grim fejl. Åh. Men ja, det er den forventede adfærd.

Med denne genopbygning af indekset, der kan genoptages, introducerede SQL Server også en ny DMV sys.index_resumable_operations for at kontrollere, om handlinger er sat på pause. Lad os prøve at se nærmere på denne DMV:

DMV-resultatforespørgslen returnerer min index rebuild-kommando, den fuldførte procentdel er en fantastisk ting og mere. Når alle dine indeksgenopbygningsoperationer er udført, returnerer DMV tom:

Ret pænt, ikke?

Men hvad hvis du ændrer mening om bordet? Hvad hvis der var en ændring i kravene, og du skal lave ændringer i databasedesignet? Lad os prøve at droppe bordet:

Det vil give endnu en grim, lang fejlmeddelelse:

Besked 10637, niveau 16, tilstand 1, linje 1
Kan ikke udføre denne handling på 'objekt' med ID 581577110, da et eller flere indekser i øjeblikket er i genoptagelig indeksgenopbygningstilstand. Se venligst sys.index_resumable_operations for flere detaljer.
Samlet udførelsestid:00:00:00.018

Herfra vil du indse, at du ikke har andet valg end at AFBRYDE operationen fuldstændigt eller GENOPTAGE og lade genopbygningen fuldføre.

Se T-SQL-kommandoen for at genoptage eller afbryde handlingen. Så kan du droppe tabellen med succes:

ALTER INDEX IX_ID_Name ON [dbo].[TabletoIndex] RESUME 
ALTER INDEX IX_ID_Name ON [dbo].[TabletoIndex] ABORT 
 

Den samme fejl vil også opstå, hvis du har brug for at udføre andre handlinger, såsom at droppe indekset fuldstændigt eller dræbe den aktuelle session.

Men du spørger dig selv, er den genoptagelige mulighed i første omgang? Svaret er NEJ. For SQL 2019 er al oprettelse af indeks med RESUMABLE=ON som standard. Det er på grund af disse 2 udsagn om omfang:

ALTER DATABASE SCOPED CONFIGURATION SET ELEVATE_ONLINE=WHEN_SUPPORTED ALTER DATABASE SCOPED CONFIGURATION SET ELEVATE_RESUMABLE=WHEN_SUPPORTED  

Oversigt

Virkningen af ​​at bruge muligheden for genoptagelig funktion på ydeevnen er ikke anderledes end at bruge den normale genindeksering. SQL Server giver dig bare mere kontrol over dine databasevedligeholdelsesoperationer.

Hvad angår krav til genopbygning af indekset i periodiske skemaer, er den bedste praksis stadig at køre indeksoperationer offline eller i det mindste uden for myldretiden for at sikre minimal indvirkning på virksomheden.


  1. Vælg sidste række i MySQL

  2. Hvordan får jeg adgang til Oracle fra Python?

  3. 3 måder at returnere Modulo i MariaDB

  4. Har T-SQL en aggregeret funktion til at sammenkæde strenge?