SQL 2017 đã giới thiệu khả năng tạm dừng và tiếp tục các hoạt động xây dựng lại chỉ mục trong quá trình bảo trì cơ sở dữ liệu. Tính năng này mang lại sự linh hoạt hơn cho quản trị viên cơ sở dữ liệu vì nó cho phép họ chọn giữa lập chỉ mục ngoại tuyến và trực tuyến cùng với việc tạm dừng và tiếp tục xây dựng lại chỉ mục bất cứ khi nào cần.
Trước khi phát hành chỉ mục có thể tiếp tục, quản trị viên cơ sở dữ liệu có thể thực hiện xây dựng lại chỉ mục ngoại tuyến và trực tuyến .
Ngoại tuyến cung cấp khả năng thực thi nhanh hơn, vì bảng bị khóa cho bất kỳ đọc nào hoặc viết hoạt động và chỉ mục mới được xây dựng từ chỉ mục cũ. Trong quá trình này, không có thao tác đọc hoặc ghi nào được phép. Khi thao tác hoàn tất, khóa bảng sẽ được giải phóng và cho phép lại các thao tác đọc và ghi. Ngoại tuyến tùy chọn tự nhiên nhanh hơn.
Trực tuyến giữ bàn mở để đọc và viết các hoạt động. Có một bản sao chỉ mục khác được tạo và tất cả các hoạt động xây dựng lại chỉ mục đều nằm trong bản sao đó. Tất cả các hoạt động hàng mới được ghi vào cả hai chỉ mục. Khi quá trình xây dựng lại hoàn tất, quá trình chuyển đổi được thực hiện và bản sao chỉ mục mới sẽ được sử dụng. Trực tuyến xây dựng lại cho phép xây dựng lại các hoạt động trong khi cơ sở dữ liệu trực tuyến. Thời gian chết là tối thiểu.
Lưu ý rằng tính năng chỉ mục có thể tiếp tục chỉ có sẵn trong phiên bản SQL Server Enterprise và phiên bản dành cho nhà phát triển miễn phí. Nếu bạn có tùy chọn này trên bàn, bạn có thể thử với nó, thực hiện một bài kiểm tra đơn giản và xem liệu tính năng này có hữu ích trong trường hợp của bạn hay không.
Tài liệu của Microsoft nêu các khía cạnh sau để bạn cân nhắc:
- Bạn có thể quản lý, lập kế hoạch và mở rộng các cửa sổ duy trì chỉ mục. Bạn có thể tạm dừng và bắt đầu lại các hoạt động tạo chỉ mục hoặc xây dựng lại khi cần phù hợp với các cửa sổ bảo trì của mình.
- Bạn có thể khôi phục sau các lỗi tạo hoặc xây dựng lại chỉ mục (chẳng hạn như chuyển đổi dự phòng cơ sở dữ liệu hoặc hết dung lượng đĩa).
- Lưu ý rằng khi tạm dừng thao tác lập chỉ mục, cả chỉ mục gốc và chỉ mục mới được tạo sẽ yêu cầu dung lượng đĩa. Bạn sẽ cần cập nhật chúng trong quá trình hoạt động DML.
- Bạn có thể cho phép cắt ngắn nhật ký giao dịch trong quá trình tạo chỉ mục hoặc hoạt động xây dựng lại.
- Lưu ý rằng tùy chọn SORT_IN_TEMPDB =ON không được hỗ trợ
Hãy kiểm tra việc xây dựng lại chỉ mục có thể tiếp tục. Tôi sẽ sử dụng hình ảnh vùng chứa đang chạy phiên bản SQL Server Developer phiên bản 2019. Ngoài ra, tôi sẽ tạo một bảng nhỏ chỉ với một vài cột và chèn khoảng một triệu hàng vào bảng đó. Bạn có thể làm cho bảng lớn hơn với nhiều hàng hơn.
Vì tôi đang sử dụng máy Linux và không thể cài đặt SQL Server Management Studio, tôi sẽ sử dụng ứng dụng khách Azure Data Studio để kết nối với SQL Server của mình. Hãy xem ảnh chụp màn hình các thuộc tính SQL Server của tôi:
Chúng tôi sẽ tạo cơ sở dữ liệu mẫu, bảng và chỉ mục bằng các tập lệnh T-SQL bên dưới. Bạn có thể thực thi chúng một cách hoàn hảo với SSMS hoặc dbForge Studio dành cho 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
Để điền dữ liệu ngẫu nhiên vào bảng, hãy thực thi tập lệnh dưới đây:
--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
Với một bảng được điền sẵn sàng, chúng ta có thể tiếp tục lập chỉ mục có thể tiếp tục. Hãy bắt đầu với việc tạo chỉ mục đó:
-- 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
Lưu ý các tùy chọn / tham số mới trong lệnh trên. RESUMABLE =BẬT có nghĩa là chúng tôi muốn có một hoạt động chỉ mục có thể tiếp tục. Max_Duration là giá trị tính bằng phút xác định thời gian chúng ta muốn lập chỉ mục chạy.
Trong khi lệnh trên đang chạy, hãy mở một phiên khác và thực hiện lệnh T-SQL bên dưới để TẠM DỪNG hoạt động xây dựng lại đang diễn ra:
--Rebuild WITH RESUMABLE functionality
ALTER INDEX IX_ID_Name ON [dbo].[TabletoIndex] PAUSE
GO
Nếu TẠM DỪNG lệnh thành công, chúng tôi tạm dừng hoạt động lập chỉ mục hiện tại đã bắt đầu khoảng một phút trước. Tuy nhiên, khi bạn quay lại phiên trước đó cho lệnh xây dựng lại với resumable =ON , nó trả về một lỗi xấu. Ặc. Nhưng có, đó là hành vi được mong đợi.
Với việc xây dựng lại chỉ mục có thể tiếp tục này, SQL Server cũng đã giới thiệu một DMV sys.index_resumable_operations mới để kiểm tra các hoạt động bị tạm dừng. Hãy thử xem xét DMV này:
Truy vấn kết quả DMV trả về lệnh xây dựng lại chỉ mục của tôi, tỷ lệ phần trăm đã hoàn thành là một điều tuyệt vời và hơn thế nữa. Khi tất cả các hoạt động xây dựng lại chỉ mục của bạn hoàn tất, DMV trả về trống:
Khá gọn gàng phải không?
Nhưng nếu bạn thay đổi ý định về chiếc bàn thì sao? Điều gì sẽ xảy ra nếu có một sự thay đổi trong các yêu cầu và bạn cần thực hiện các thay đổi đối với thiết kế cơ sở dữ liệu? Hãy thử bỏ bảng:
Nó sẽ đưa ra một thông báo lỗi dài và xấu xí khác:
Bản tin 10637, Mức 16, Trạng thái 1, Dòng 1
Không thể thực hiện thao tác này trên ‘đối tượng’ có ID 581577110 vì một hoặc nhiều chỉ mục hiện đang ở trạng thái xây dựng lại chỉ mục có thể tiếp tục. Vui lòng tham khảo sys.index_resumable_operations để biết thêm chi tiết.
Tổng thời gian thực hiện:00:00:00.018
Từ đây, bạn sẽ nhận ra rằng bạn không có lựa chọn nào khác ngoài việc TRÁNH hoàn toàn hoạt động hoặc TIẾP TỤC và để việc xây dựng lại hoàn tất.
Xem lệnh T-SQL để tiếp tục hoặc hủy bỏ hoạt động. Sau đó, bạn có thể bỏ bảng thành công:
ALTER INDEX IX_ID_Name ON [dbo].[TabletoIndex] RESUME
ALTER INDEX IX_ID_Name ON [dbo].[TabletoIndex] ABORT
Lỗi tương tự cũng sẽ xảy ra nếu bạn cần thực hiện các thao tác khác như giảm hoàn toàn chỉ mục hoặc hủy phiên hiện tại.
Nhưng bạn tự hỏi mình, liệu có phải tùy chọn nối lại ở nơi đầu tiên không? Câu trả lời là không. Đối với SQL 2019, tất cả việc tạo chỉ mục là RESUMABLE =ON theo mặc định. Đó là vì 2 câu lệnh phạm vi này:
ALTER DATABASE SCOPED CONFIGURATION SET ELEVATE_ONLINE=WHEN_SUPPORTED ALTER DATABASE SCOPED CONFIGURATION SET ELEVATE_RESUMABLE=WHEN_SUPPORTED
Tóm tắt
Tác động của việc sử dụng tùy chọn có thể tiếp tục lên hiệu suất không khác gì so với việc sử dụng thao tác lập chỉ mục thông thường. SQL Server chỉ cung cấp cho bạn nhiều quyền kiểm soát hơn đối với các hoạt động bảo trì cơ sở dữ liệu của bạn.
Đối với các yêu cầu xây dựng lại chỉ mục bảng tuần hoàn của bạn, cách tốt nhất vẫn là chạy các hoạt động lập chỉ mục ngoại tuyến hoặc ít nhất là trong giờ thấp điểm để đảm bảo tác động kinh doanh tối thiểu.