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

3 metody opětovného sestavení všech indexů pro všechny tabulky pomocí T-SQL v databázi SQL Server

Existuje několik metod, jak znovu sestavit všechny indexy všech tabulek na serveru SQL Server, mezi nimi:

  1. Používání plánů údržby serveru SQL Server.
  2. Použití skriptu T-SQL na základě procenta fragmentace.
  3. Pomocí příkazu ALTER INDEX.

V tomto článku tyto metody prozkoumáme a ukážeme si je na praktických příkladech.

1. Plán údržby indexu obnovení SQL Server

První možností ke kontrole je opětovné sestavení indexů s plány údržby databáze. Plány údržby jsou k dispozici ve složce správy SQL Server Management Studio.

Chcete-li vytvořit plán údržby databáze SQL, spusťte SQL Server Management Studio > rozbalte instanci databáze > Správa > klikněte pravým tlačítkem myši na plán údržby > Nový plán údržby .

Zadejte název plánu údržby. Poté přetáhněte Úlohu znovu vytvořit index do projektanta plánu údržby. Přejmenujte úlohu na Index Maintenance .

Dalším krokem je konfigurace plánu údržby. Poklepejte na něj a nakonfigurujte možnosti v Úkole znovu vytvořit index takto:

  • Vyberte AdventureWorks2017 databáze z rozbalovací nabídky Databáze.
  • Chcete-li znovu vytvořit indexy všech tabulek, vyberte Tabulky a zobrazení z Objektu rozevíracím seznamu.
  • Zaškrtněte Řadit výsledky v tempdb .
  • MAXDOP – nastavte 2 (dva).
  • V našem případě indexy znovu sestavíme pouze v případě, že Fragmentace hodnota je vyšší než 20 %. Proto nastavte 20 v příslušném poli.
  • Klikněte na tlačítko OK uložte konfiguraci indexu a zavřete úlohu znovu vytvořit index okno.

Nyní nakonfigurujeme plán.

Klikněte na kalendář ikona v horní části návrháře plánu údržby:

Nový rozvrh práce otevře se okno. Nakonfigurujeme následující nastavení:

  • Provádějte úlohu každý den. V části Typ plánu v nabídce vybereme Opakující se . Poté v části Frekvence v sekci vybereme Vyskytuje se > Denně .
  • Opakuje se každý > 1 (den).
  • Denní frekvence > Vyskytuje se jednou v > uveďte přesný čas. V našem případě je to 1:00.
  • Klikněte na OK .

Poté plán údržby uložte.

Vytvořené plány údržby jsou k dispozici v Plánu údržby SSMS adresář. Chcete-li zobrazit plán spojený s konkrétním plánem údržby, zkontrolujte Úlohy adresář pod SQL Server Agent .

Chcete-li úlohu otestovat, klikněte pravým tlačítkem na její název v Plánech údržby adresář a vyberte Provést z nabídky:

Provádění začíná. Po úspěšném dokončení se zobrazí následující dialogové okno:

To byla běžná metoda přestavby indexů s plány údržby. Nyní přejdeme k další metodě – pomocí skriptů T-SQL.

2. Rebuild SQL Server ALTER INDEX

Příkaz ALTER INDEX lze použít k opětovnému sestavení všech indexů tabulky. Syntaxe je následující:

ALTER INDEX ALL ON [table_name] REBUILD

Poznámka:název_tabulky parametr určuje název tabulky, kde chceme znovu sestavit všechny indexy v SQL Server.

Chceme například znovu sestavit všechny indexy [HumanResources].[Zaměstnanec] . Dotaz by měl být následující:

use AdventureWorks2017
go
ALTER INDEX ALL ON [HumanResources].[Employee] REBUILD
Go

3. Skript SQL Server pro opětovné sestavení všech indexů pro všechny tabulky na základě fragmentace

Údržba indexu je náročná na zdroje. Kromě toho zamyká tabulku, kde přestavuje index. Abychom se vyhnuli takovým komplikacím, musíme znovu vytvořit index, kde je fragmentace indexu SQL Serveru vyšší než 40 %.

Pro ilustraci tohoto případu jsem vytvořil skript T-SQL, který znovu sestavuje indexy se stupněm fragmentace vyšším než 30 %. Pojďme prozkoumat jeho části a funkce.

Deklarace proměnných a dočasné tabulky

Nejprve musíme vytvořit dočasné tabulky a proměnné:

  • @IndexFregQuery – ukládá dynamický dotaz používaný k naplnění fragmentovaných indexů.
  • @IndexRebuildQuery – obsahuje dotaz ALTER INDEX.
  • @IndexName – název indexu, který chceme znovu sestavit
  • @TableName – název tabulky, kde chceme index znovu sestavit.
  • @SchemaName – název schématu, kde chceme index znovu sestavit.
  • #Fregmentedindex – tabulka se 3 sloupci který ukládá název indexu, název tabulky a název schématu.

Následující kód deklaruje naše proměnné a dočasnou tabulku:

declare @i int=0
declare @IndexCount int
declare @IndexFregQuery nvarchar(max)
declare @IndexRebuildQuery nvarchar(max)
declare @IndexName varchar(500)
declare @TableName varchar(500)
declare @SchemaName varchar(500)
create table #Fregmentedindex(Index_name varchar(max),table_name varchar(max),schema_name varchar(max))

Získejte seznam fragmentovaných indexů

Naším dalším krokem je naplnění seznamu indexů stupněm fragmentace 30 % nebo vyšším. Tyto indexy musíme vložit do #FregmentedIndexes tabulka.

Dotaz musí vyplnit název schématu, název tabulky a název indexu, aby je mohl vložit do dočasné tabulky. Podívejte se na tento dotaz:

set @IndexFregQuery='SELECT i.[name],o.name,sch.name
	FROM   [' + @DatabaseName + '].sys.dm_db_index_physical_stats (DB_ID('''+ @DatabaseName +'''), NULL, NULL, NULL, NULL) AS s
	INNER JOIN [' + @DatabaseName + '].sys.indexes AS i ON s.object_id = i.object_id AND s.index_id = i.index_id
	INNER JOIN [' + @DatabaseName + '].sys.objects AS o ON i.object_id = o.object_id
	INNER JOIN [' + @DatabaseName + '].sys.schemas AS sch ON o.schema_id=sch.schema_id
	WHERE (s.avg_fragmentation_in_percent > 30 ) and i.name is not null'
insert into #Fregmentedindex(Index_name,table_name,schema_name) exec sp_executesql @IndexFregQuery

Vytvořte dynamický dotaz SQL

Nakonec musíme vytvořit dynamický ALTER INDEX příkaz a spusťte jej.

Ke generování příkazu používáme smyčku WHILE. Iteruje se přes #FregmentedIndexes tabulku a vyplní název schématu, název tabulky a název indexu a uloží je do @SchemaName , @TableName a @IndexName . Hodnoty parametrů jsou připojeny v příkazu ALTER INDEX.

Kód je následující:

set @IndexCount=(select count(1) from #Fregmentedindex)
While (@IndexCount>@i)
begin 
(select top 1 @TableName=table_name, @IndexName=Index_name,@SchemaName= schema_name from #Fregmentedindex)
Set @IndexRebuildQuery ='Alter index [' + @IndexName +'] on ['[email protected] +'].['[email protected]+'].[' + @TableName +'] rebuild'
exec sp_executesql @IndexRebuildQuery 
set @[email protected]+1
delete from #Fregmentedindex where [email protected] and [email protected]
End

Celý kód jsem zapouzdřil do sp_index_maintenance uložená procedura vytvořená v DBATools databáze. Kód je následující:

use DBATools
go
Create procedure sp_index_maintenance_daily
@DatabaseName varchar(50)
as
begin
declare @i int=0
declare @IndexCount int
declare @IndexFregQuery nvarchar(max)
declare @IndexRebuildQuery nvarchar(max)
declare @IndexName varchar(500)
declare @TableName varchar(500)
declare @SchemaName varchar(500)
create table #Fregmentedindex(Index_name varchar(max),table_name varchar(max),schema_name varchar(max))
set @IndexFregQuery='SELECT i.[name],o.name,sch.name
	FROM   [' + @DatabaseName + '].sys.dm_db_index_physical_stats (DB_ID('''+ @DatabaseName +'''), NULL, NULL, NULL, NULL) AS s
	INNER JOIN [' + @DatabaseName + '].sys.indexes AS i ON s.object_id = i.object_id AND s.index_id = i.index_id
	INNER JOIN [' + @DatabaseName + '].sys.objects AS o ON i.object_id = o.object_id
	INNER JOIN [' + @DatabaseName + '].sys.schemas AS sch ON o.schema_id=sch.schema_id
	WHERE (s.avg_fragmentation_in_percent > 30 ) and i.name is not null'
insert into #Fregmentedindex(Index_name,table_name,schema_name) exec sp_executesql @IndexFregQuery
set @IndexCount=(select count(1) from #Fregmentedindex)
While (@IndexCount>@i)
begin 
(select top 1 @TableName=table_name, @IndexName=Index_name,@SchemaName= schema_name from #Fregmentedindex)
Set @IndexRebuildQuery ='Alter index [' + @IndexName +'] on ['[email protected] +'].['[email protected]+'].[' + @TableName +'] rebuild'
exec sp_executesql @IndexRebuildQuery 
set @[email protected]+1
delete from #Fregmentedindex where [email protected] and [email protected]
End
End

Jakmile je procedura připravena, můžeme nakonfigurovat úlohu SQL.

Rozbalte SQL Server Agent > klikněte pravým tlačítkem na Úkoly > Nové zaměstnání .

Nové zaměstnání otevře se okno, kde byste měli zadat požadovaný název úlohy.

Chcete-li vytvořit krok úlohy, přejděte na Kroky sekce> Nové tlačítko:

Dostanete se k kroku nové úlohy okno pro konfiguraci tohoto kroku.

Zadejte požadovaný název kroku a do textového pole zadejte následující kód:

use DBATools
go
exec sp_index_maintenance_daily 'AdventureWorks2017'

Chcete-li nakonfigurovat plán, přejděte na Plány > klikněte na Nový .

Naše práce by měla být provedena v 1:00. Podle toho nakonfigurujeme plán:

  • Typ plánu > Opakující se .
  • Frekvence sekce> Vyskytuje se > Denně ; Opakuje se každý > 1 (jeden).
  • Denní frekvence sekce> Vyskytuje se jednou v > 01:00:00.
  • Klikněte na OK .

Budete převedeni zpět do Nového zaměstnání sekce. Klikněte na OK tam také k vytvoření úlohy.

Nově vytvořené pracovní místo je dostupné v Úkoly adresář pod SQL Server Agent složka.

Nyní musíme úlohu otestovat:klikněte na ni pravým tlačítkem a vyberte Spustit úlohu…

Úloha se spustí a po úspěšném dokončení se zobrazí následující zpráva:

Pokud porovnáme seskupený index a neklastrovaný index, uvidíme, že vytvoření jedinečného seskupeného indexu zvyšuje efektivitu výkonu dotazů. Indexovaná zobrazení na serveru SQL Server lze použít k urychlení provádění dotazu. Podívejte se také, jak spravovat indexy pomocí SQL Index Manager.

Shrnutí

Aktuální článek představil tři funkční způsoby přestavby indexů všech tabulek. Všechny jsme je prozkoumali pomocí podrobných pokynů a praktických příkladů indexů SQL, abychom ilustrovali konfiguraci úlohy. Výběr vhodné varianty je na vás a doufáme, že vám tento článek pomohl.


  1. Jakých je 6 hlavních součástí aplikace Microsoft Access?

  2. Může Mysql rozdělit sloupec?

  3. Ignoruje MySQL hodnoty null na jedinečných omezeních?

  4. Rozšíření mysql je zastaralé a bude v budoucnu odstraněno:použijte místo něj mysqli nebo PDO