sql >> Databáze >  >> RDS >> Sqlserver

SQL Server Resumable Index:Je to pro vás dobré?

SQL 2017 zavedl možnost pozastavit a obnovit operace obnovy indexu během údržby databáze. Tato funkce nabízí správcům databází větší flexibilitu, protože jim umožňuje vybrat si mezi offline a online reindexací spolu s pozastavením a obnovením přestavby indexu, kdykoli je to potřeba.

Před vydáním obnovitelného indexu mohli administrátoři databází provést opětovné sestavení indexu offline a online .

Offline nabízí rychlejší provádění, protože tabulka je uzamčena pro jakékoli čtení nebo napište operace a nový index je vytvořen ze starého indexu. Během tohoto procesu není povolena žádná operace čtení ani zápisu. Po dokončení operace se zámek tabulky uvolní a operace čtení a zápisu jsou znovu povoleny. Offline možnost je přirozeně rychlejší.

Online ponechá tabulku otevřenou pro čtení a napište operace. Je vytvořena další kopie indexu a všechny operace opětovného sestavení indexu jsou v této kopii. Všechny operace s novými řádky se zapisují do obou indexů. Po dokončení přestavby se provede přepnutí a začne se používat nová kopie indexu. Online rebuild umožňuje operace opětovného sestavení, když je databáze online. Prostoje jsou minimální.

Všimněte si, že funkce obnovitelného indexu je k dispozici pouze ve verzi SQL Server Enterprise a bezplatné verzi pro vývojáře. Pokud máte tuto možnost na stole, můžete si s ní pohrát, provést jednoduchý test a zjistit, zda je tato funkce ve vašem případě užitečná.

Dokumentace společnosti Microsoft uvádí pro vaše úvahy následující aspekty:

  • Můžete spravovat, plánovat a prodlužovat okna údržby indexu. Můžete pozastavit a znovu spustit operace vytváření nebo opětovného sestavení indexu, když potřebujete přizpůsobit okna údržby.
  • Můžete se zotavit ze selhání vytvoření nebo opětovného sestavení indexu (jako je selhání databáze nebo nedostatek místa na disku).
  • Věnujte pozornost tomu, že když je operace indexování pozastavena, původní i nově vytvořený index budou vyžadovat místo na disku. Budete je muset aktualizovat během operací DML.
  • Během operací vytváření nebo opětovného vytváření indexu můžete povolit zkrácení protokolů transakcí.
  • Všimněte si, že možnost SORT_IN_TEMPDB=ON není podporována

Pojďme otestovat obnovení obnovitelného indexu. Použiji obrázek kontejneru se systémem SQL 2019 Server Developer edition. Také vytvořím malou tabulku s několika sloupci a vložím do ní asi milion řádků. Tabulku můžete zvětšit pomocí více řádků.

Protože používám počítač se systémem Linux a nemohu nainstalovat SQL Server Management Studio, použiji k připojení ke svému SQL Server klienta Azure Data Studio. Podívejte se na snímek obrazovky vlastností mého serveru SQL:

Pomocí níže uvedených skriptů T-SQL vytvoříme ukázkovou databázi, tabulku a index. Můžete je bezchybně spustit pomocí SSMS nebo dbForge Studio pro 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 

Chcete-li naplnit tabulku náhodnými daty, spusťte níže uvedený skript:

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

S připravenou naplněnou tabulkou můžeme přejít k obnovitelnému indexu. Začněme vytvořením tohoto indexu:

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

Všimněte si nových možností/parametrů ve výše uvedeném příkazu. RESUMABLE=ON znamená, že chceme mít operaci s obnovitelným indexem. Max_Duration je hodnota v minutách a určuje, jak dlouho má indexování běžet.

Zatímco je spuštěn výše uvedený příkaz, otevřete další relaci a spusťte níže uvedený příkaz T-SQL, abyste PAUSE probíhající přestavba:

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

Pokud PAUSE je úspěšný, pozastavíme aktuální operaci indexování zahájenou asi před minutou. Když se však vrátíte k předchozí relaci pro příkaz rebuild s resumable=ON , vrátí ošklivou chybu. Fuj. Ale ano, to je očekávané chování.

S tímto obnovitelným přebudováním indexu SQL Server také představil nový DMV sys.index_resumable_operations pro kontrolu pozastavených operací. Zkusme se podívat na tento DMV:

Dotaz na výsledek DMV vrátí můj příkaz k opětovnému sestavení indexu, procento dokončení je skvělá věc a další. Po dokončení všech operací opětovného sestavení indexu DMV vrátí prázdnou:

Docela pěkné, co?

Ale co když změníte názor na stůl? Co když došlo ke změně požadavků a vy potřebujete provést změny v návrhu databáze? Zkusme shodit stůl:

Zobrazí další ošklivou, dlouhou chybovou zprávu:

Zpráva 10637, úroveň 16, stát 1, řádek 1
Tuto operaci nelze provést na „objektu“ s ID 581577110, protože jeden nebo více indexů je aktuálně ve stavu obnovení indexu. Další podrobnosti naleznete v sys.index_resumable_operations.
Celkový čas provedení:00:00:00.018

Odtud si uvědomíte, že nemáte jinou možnost, než operaci úplně PŘERUŠIT nebo OBNOVIT a nechat přestavbu dokončit.

Pro obnovení nebo přerušení operace viz příkaz T-SQL. Potom můžete tabulku úspěšně zrušit:

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

Ke stejné chybě dojde také v případě, že potřebujete provést další operace, jako je úplné zrušení indexu nebo ukončení aktuální relace.

Ale ptáte se sami sebe, je na prvním místě možnost obnovení? Odpověď je ne. Pro SQL 2019 je vytváření indexů ve výchozím nastavení RESUMABLE=ON. Je to kvůli těmto 2 prohlášením o rozsahu:

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

Shrnutí

Dopad použití možnosti obnovení na výkon se neliší od použití normální operace reindexace. SQL Server vám pouze poskytuje větší kontrolu nad operacemi údržby databáze.

Pokud jde o požadavky na obnovu indexu periodické tabulky, nejlepším postupem je stále spouštět operace indexu offline, nebo alespoň mimo špičku, aby byl zajištěn minimální dopad na podnikání.


  1. Oprava „ERROR 3942 (HY000):Každý řádek klauzule VALUES musí mít alespoň jeden sloupec“ při použití příkazu VALUES v MySQL

  2. Přehled komprese dat v SQL Server

  3. Jak uzavřít mezeru ve zranitelnosti v PostgreSQL

  4. Oracle:Aktualizace sloupce tabulky pomocí ROWNUM ve spojení s klauzulí ORDER BY