Ada beberapa metode cara membangun kembali semua indeks semua tabel di SQL Server, di antaranya:
- Menggunakan rencana pemeliharaan SQL Server.
- Menggunakan skrip T-SQL berdasarkan persentase fragmentasi.
- Menggunakan perintah ALTER INDEX.
Dalam artikel ini, kita akan mempelajari metode ini dan mengilustrasikannya dengan contoh praktis.
1. Rencana Pemeliharaan Indeks Pembuatan Ulang SQL Server
Opsi pertama untuk ditinjau adalah membangun kembali indeks dengan rencana pemeliharaan basis data. Rencana pemeliharaan tersedia di bawah folder manajemen SQL Server Management Studio.
Untuk membuat rencana pemeliharaan database SQL, luncurkan SQL Server Management Studio > perluas instance database > Manajemen > klik kanan pada rencana pemeliharaan > Rencana Pemeliharaan Baru .
Tentukan nama rencana pemeliharaan. Kemudian, seret dan lepas Build Ulang Tugas Indeks ke dalam perancang rencana pemeliharaan. Ganti nama tugas menjadi Pemeliharaan Indeks .
Langkah selanjutnya adalah mengkonfigurasi rencana pemeliharaan. Klik dua kali dan konfigurasikan opsi pada Tugas Membangun Kembali Indeks sebagai berikut:
- Pilih AdventureWorks2017 database dari menu tarik-turun Database.
- Untuk membangun kembali indeks semua tabel, pilih Tabel dan Tampilan dari Objek kotak tarik-turun.
- Centang Urutkan hasil dalam tempdb .
- MAXDOP – atur 2 (dua).
- Dalam kasus kami, kami akan membangun kembali indeks hanya jika Fragmentasi nilainya lebih dari 20%. Oleh karena itu, setel 20 di bidang masing-masing.
- Klik Oke untuk menyimpan konfigurasi indeks dan menutup Tugas Membangun Kembali Indeks jendela.
Sekarang, mari kita konfigurasikan jadwalnya.
Klik kalender ikon di atas perancang rencana pemeliharaan:
Jadwal Kerja Baru jendela akan terbuka. Mari konfigurasikan pengaturan berikut:
- Jalankan pekerjaan setiap hari. Di Jenis jadwal menu, kami memilih Berulang . Kemudian, di Frekuensi bagian, kami memilih Terjadi > Harian .
- Berulang setiap > 1 (hari).
- Frekuensi harian > Terjadi sekali pada > tentukan waktu yang tepat. Dalam kasus kami, ini jam 1 pagi.
- Klik Oke .
Setelah itu, simpan rencana perawatan.
Rencana pemeliharaan yang dibuat tersedia di SSMS Rencana Pemeliharaan direktori. Untuk melihat jadwal yang terkait dengan rencana pemeliharaan tertentu, periksa Pekerjaan direktori di bawah Agen SQL Server .
Untuk menguji pekerjaan, klik kanan pada namanya di Rencana Pemeliharaan direktori, dan pilih Jalankan dari menu:
Eksekusi dimulai. Ketika selesai dengan sukses, Anda akan melihat kotak dialog berikut:
Ini adalah metode umum untuk membangun kembali indeks dengan rencana pemeliharaan. Sekarang, mari kita lanjutkan ke metode berikutnya – menggunakan skrip T-SQL.
2. Pembuatan Ulang SQL Server ALTER INDEX
Perintah ALTER INDEX dapat digunakan untuk membangun kembali semua indeks tabel. Sintaksnya adalah sebagai berikut:
ALTER INDEX ALL ON [table_name] REBUILD
Catatan:nama_tabel parameter menentukan nama tabel tempat kita ingin membangun kembali semua indeks di SQL Server.
Misalnya, kami ingin membangun kembali semua indeks [HumanResources].[Employee] . Kueri harus sebagai berikut:
use AdventureWorks2017
go
ALTER INDEX ALL ON [HumanResources].[Employee] REBUILD
Go
3. Skrip SQL Server untuk Membangun Kembali Semua Indeks untuk Semua Tabel Berdasarkan Fragmentasi
Pemeliharaan indeks membutuhkan banyak sumber daya. Selain itu, ia mengunci tabel tempat ia membangun kembali indeks. Untuk menghindari komplikasi seperti itu, kita harus membangun kembali indeks di mana fragmentasi indeks SQL Server lebih tinggi dari 40%.
Untuk mengilustrasikan kasus ini, saya telah membuat skrip T-SQL yang membangun kembali indeks dengan tingkat fragmentasi lebih tinggi dari 30%. Mari kita telusuri bagian-bagian dan fungsinya.
Deklarasi variabel dan tabel temp
Pertama, kita perlu membuat tabel dan variabel temp:
- @IndexFregQuery – menyimpan kueri dinamis yang digunakan untuk mengisi indeks yang terfragmentasi.
- @IndexRebuildQuery – menyimpan kueri ALTER INDEX.
- @NamaIndeks – nama indeks yang ingin kita buat kembali
- @NamaTabel – nama tabel tempat kita ingin membangun kembali indeks.
- @NamaSkema – nama skema tempat kita ingin membangun kembali indeks.
- #Fregmentedindex – tabel 3 kolom yang menyimpan nama indeks, nama tabel, dan nama skema.
Kode berikut mendeklarasikan variabel kami dan tabel temp:
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))
Dapatkan daftar indeks yang terfragmentasi
Langkah kita selanjutnya adalah mengisi daftar indeks dengan tingkat fragmentasi 30% atau lebih tinggi. Kita harus memasukkan indeks tersebut ke dalam #FregmentedIndexes tabel.
Kueri harus mengisi nama skema, nama tabel, dan nama indeks untuk memasukkannya ke dalam tabel sementara. Lihat kueri itu:
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
Membuat Kueri SQL dinamis
Terakhir, kita harus membangun ALTER INDEX yang dinamis perintah dan jalankan.
Untuk menghasilkan perintah, kami menggunakan loop WHILE. Itu berulang melalui #FregmentedIndexes tabel dan mengisi nama skema, nama tabel, dan nama indeks untuk menyimpannya di @NamaSkema , @NamaTabel , dan @NamaIndeks . Nilai parameter ditambahkan dalam perintah ALTER INDEX.
Kodenya adalah sebagai berikut:
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
Saya telah merangkum seluruh kode di sp_index_maintenance prosedur tersimpan yang dibuat di DBATools basis data. Kodenya sebagai berikut:
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
Setelah prosedur siap, kita dapat mengonfigurasi SQL Job.
Perluas Agen SQL Server > klik kanan pada Pekerjaan > Pekerjaan Baru .
Pekerjaan Baru jendela terbuka di mana Anda harus menentukan nama pekerjaan yang diinginkan.
Untuk membuat langkah pekerjaan, navigasikan ke Langkah bagian> Baru tombol:
Anda akan sampai ke Langkah Pekerjaan Baru jendela untuk mengonfigurasi langkah tersebut.
Masukkan nama langkah yang diinginkan dan masukkan kode berikut ke dalam kotak teks:
use DBATools
go
exec sp_index_maintenance_daily 'AdventureWorks2017'
Untuk mengonfigurasi jadwal, buka Jadwal > klik Baru .
Pekerjaan kita harus dilaksanakan pada pukul 1:00 pagi. Dengan demikian, kami mengonfigurasi jadwal:
- Jenis jadwal > Berulang .
- Frekuensi bagian> Terjadi > Harian ; Berulang setiap > 1 (satu).
- Frekuensi harian bagian> Terjadi sekali pada > 01:00:00.
- Klik Oke .
Anda akan dipindahkan kembali ke Pekerjaan Baru bagian. Klik Oke di sana juga untuk menciptakan pekerjaan.
Pekerjaan yang baru dibuat tersedia di Pekerjaan direktori di bawah SQL Server Agent folder.
Sekarang kita perlu menguji pekerjaan:klik kanan padanya dan pilih Mulai Pekerjaan ...
Pekerjaan dimulai, dan setelah berhasil diselesaikan, Anda akan melihat pesan berikut:
Jika kita membandingkan indeks berkerumun vs indeks tidak berkerumun, kita akan melihat bahwa membuat indeks berkerumun unik meningkatkan efisiensi kinerja kueri. Tampilan yang diindeks di SQL Server dapat digunakan untuk mempercepat eksekusi kueri. Lihat juga cara mengelola indeks menggunakan SQL Index Manager.
Ringkasan
Artikel saat ini menyajikan tiga cara fungsional untuk membangun kembali indeks semua tabel. Kami telah menjelajahi semuanya dengan panduan langkah demi langkah dan contoh indeks SQL praktis untuk menggambarkan konfigurasi pekerjaan. Pilihan varian yang sesuai ada di tangan Anda, dan kami berharap artikel ini dapat membantu Anda.