Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

SQL Server Resumable Index:Apakah ini baik untuk Anda?

SQL 2017 memperkenalkan kemampuan untuk menjeda dan melanjutkan operasi pembangunan kembali indeks selama pemeliharaan database. Fitur ini menawarkan lebih banyak fleksibilitas kepada administrator basis data karena memungkinkan mereka untuk memilih antara pengindeksan ulang offline dan online bersama dengan menjeda dan melanjutkan pembangunan kembali indeks kapan pun diperlukan.

Sebelum rilis indeks yang dapat dilanjutkan, administrator basis data dapat menjalankan pembangunan kembali indeks offline dan daring .

Luring menawarkan eksekusi yang lebih cepat, karena tabel dikunci untuk membaca . apa pun atau tulis operasi, dan indeks baru dibangun dari indeks lama. Selama proses ini, tidak ada operasi baca atau tulis yang diizinkan. Ketika operasi selesai, kunci tabel dilepaskan, dan operasi baca dan tulis diizinkan lagi. Luring opsi ini secara alami lebih cepat.

Online membuat tabel tetap terbuka untuk dibaca dan tulis operasi. Ada salinan lain dari indeks yang dibuat, dan semua operasi pembangunan kembali indeks ada di salinan itu. Semua operasi baris baru ditulis ke kedua indeks. Ketika pembangunan kembali selesai, sakelar selesai, dan salinan indeks baru mulai digunakan. Online membangun kembali memungkinkan untuk membangun kembali operasi saat database sedang online. Waktu hentinya minimal.

Perhatikan bahwa fitur indeks yang dapat dilanjutkan hanya tersedia di edisi SQL Server Enterprise dan edisi Pengembang gratis. Jika Anda memiliki opsi ini, Anda dapat bermain-main dengannya, melakukan tes sederhana, dan melihat apakah fitur ini berguna dalam kasus Anda.

Dokumentasi Microsoft menyatakan aspek berikut untuk pertimbangan Anda:

  • Anda dapat mengelola, merencanakan, dan memperpanjang periode pemeliharaan indeks. Anda dapat menjeda dan memulai kembali operasi pembuatan indeks atau pembuatan ulang saat Anda perlu menyesuaikan masa pemeliharaan.
  • Anda dapat memulihkan dari indeks, membuat atau membangun kembali kegagalan (seperti kegagalan basis data atau kehabisan ruang disk).
  • Perhatikan bahwa ketika operasi indeks dijeda, baik indeks asli maupun yang baru dibuat akan membutuhkan ruang disk. Anda perlu memperbaruinya selama operasi DML.
  • Anda dapat mengaktifkan pemotongan log transaksi selama operasi pembuatan atau pembuatan ulang indeks.
  • Perhatikan bahwa opsi SORT_IN_TEMPDB=ON tidak didukung

Mari kita uji pembangunan kembali indeks yang dapat dilanjutkan. Saya akan menggunakan gambar wadah yang menjalankan edisi Pengembang SQL 2019 Server. Juga, saya akan membuat tabel kecil hanya dengan beberapa kolom, dan memasukkan sekitar satu juta baris ke dalam tabel itu. Anda dapat membuat tabel menjadi lebih besar dengan lebih banyak baris.

Karena saya menggunakan mesin Linux dan tidak dapat menginstal SQL Server Management Studio, saya akan menggunakan klien Azure Data Studio untuk terhubung ke SQL Server saya. Lihat tangkapan layar properti SQL Server saya:

Kami akan membuat database sampel, tabel, dan indeks dengan skrip T-SQL di bawah ini. Anda dapat menjalankannya dengan sempurna dengan SSMS atau dbForge Studio untuk 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 

Untuk mengisi tabel dengan data acak, jalankan skrip di bawah ini:

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

Dengan tabel yang terisi siap, kita dapat melanjutkan ke indeks yang dapat dilanjutkan. Mari kita mulai dengan membuat indeks itu:

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

Perhatikan opsi/parameter baru pada perintah di atas. DAPAT DIKONSUMSI=AKTIF berarti kita ingin memiliki operasi indeks yang dapat dilanjutkan. Durasi_Maks adalah nilai dalam menit yang menentukan berapa lama kita ingin pengindeksan berjalan.

Saat perintah di atas sedang berjalan, buka sesi lain dan jalankan perintah T-SQL di bawah ini untuk PAUSE aktivitas pembangunan kembali yang sedang berlangsung:

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

Jika JEDA perintah berhasil, kami menghentikan sementara operasi pengindeksan saat ini yang dimulai sekitar satu menit yang lalu. Namun, ketika Anda kembali ke sesi sebelumnya untuk perintah pembangunan kembali dengan resumable=ON , itu mengembalikan kesalahan jelek. Ugh. Tapi ya, itulah perilaku yang diharapkan.

Dengan pembangunan kembali indeks yang dapat dilanjutkan ini, SQL Server juga memperkenalkan sys.index_resumable_operations DMV baru untuk memeriksa operasi yang dijeda. Mari kita coba lihat DMV ini:

Kueri hasil DMV mengembalikan perintah pembangunan kembali indeks saya, persentase yang diselesaikan adalah hal yang hebat, dan banyak lagi. Ketika semua operasi pembangunan kembali indeks Anda selesai, DMV kembali kosong:

Cukup rapi, ya?

Tetapi bagaimana jika Anda berubah pikiran tentang meja? Bagaimana jika ada perubahan persyaratan, dan Anda perlu melakukan perubahan pada desain database? Mari kita coba untuk menjatuhkan meja:

Ini akan memberikan pesan kesalahan panjang dan jelek lainnya:

Msg 10637, Level 16, State 1, Line 1
Tidak dapat melakukan operasi ini pada 'objek' dengan ID 581577110 karena satu atau lebih indeks saat ini dalam status pembangunan kembali indeks yang dapat dilanjutkan. Silakan merujuk ke sys.index_resumable_operations untuk lebih jelasnya.
Total waktu eksekusi:00:00:00.018

Dari sini, Anda akan menyadari bahwa Anda tidak punya pilihan selain ABORT sepenuhnya operasi atau RESUME dan biarkan pembangunan kembali selesai.

Lihat perintah T-SQL untuk melanjutkan atau membatalkan operasi. Kemudian Anda dapat menjatuhkan tabel dengan sukses:

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

Kesalahan yang sama juga akan terjadi jika Anda perlu melakukan operasi lain seperti benar-benar menjatuhkan indeks atau mematikan sesi saat ini.

Tetapi Anda bertanya pada diri sendiri, apakah opsi yang dapat dilanjutkan di tempat pertama? Jawabannya adalah tidak. Untuk SQL 2019, semua pembuatan indeks dengan RESUMABLE=ON secara default. Itu karena 2 pernyataan cakupan ini:

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

Ringkasan

Dampak penggunaan opsi yang dapat dilanjutkan pada kinerja tidak berbeda dengan penggunaan operasi pengindeksan ulang normal. SQL Server hanya memberi Anda kontrol lebih besar atas operasi pemeliharaan database Anda.

Untuk persyaratan pembuatan ulang indeks tabel periodik Anda, praktik terbaik adalah tetap menjalankan operasi indeks secara offline, atau setidaknya selama jam tidak sibuk untuk memastikan dampak bisnis yang minimal.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bidang VARCHAR(MAX) saya membatasi dirinya pada 4000; apa yang memberi?

  2. Bagaimana cara memasukkan karakter Arab ke dalam database SQL?

  3. Cara PILIH * tapi tanpa Nama kolom harus unik di setiap tampilan

  4. Apakah ada cara untuk mengulang variabel tabel di TSQL tanpa menggunakan kursor?

  5. Cara Mengonversi Huruf Besar ke Huruf Kecil di SQL Server – LOWER()