Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

3 phương pháp để xây dựng lại tất cả các chỉ mục cho tất cả các bảng với T-SQL trong cơ sở dữ liệu SQL Server

Có một số phương pháp về cách xây dựng lại tất cả các chỉ mục của tất cả các bảng trong SQL Server, trong số đó:

  1. Sử dụng kế hoạch bảo trì SQL Server.
  2. Sử dụng tập lệnh T-SQL dựa trên phần trăm phân mảnh.
  3. Sử dụng lệnh ALTER INDEX.

Trong bài viết này, chúng ta sẽ khám phá các phương pháp này và minh họa chúng bằng các ví dụ thực tế.

1. Kế hoạch duy trì chỉ mục tạo lại máy chủ SQL

Tùy chọn đầu tiên để xem xét là xây dựng lại các chỉ mục với các kế hoạch bảo trì cơ sở dữ liệu. Các kế hoạch bảo trì có sẵn trong thư mục quản lý của SQL Server Management Studio.

Để tạo kế hoạch bảo trì cơ sở dữ liệu SQL, hãy khởi chạy SQL Server Management Studio > mở rộng phiên bản cơ sở dữ liệu > Quản lý > nhấp chuột phải vào kế hoạch bảo trì > Kế hoạch bảo trì mới .

Chỉ định tên của kế hoạch bảo trì. Sau đó, kéo và thả Nhiệm vụ xây dựng lại chỉ mục vào người thiết kế kế hoạch bảo trì. Đổi tên nhiệm vụ thành Bảo trì chỉ mục .

Bước tiếp theo là cấu hình kế hoạch bảo trì. Nhấp đúp vào nó và định cấu hình các tùy chọn trên Nhiệm vụ xây dựng lại chỉ mục như sau:

  • Chọn AdventureWorks2017 cơ sở dữ liệu từ (các) Cơ sở dữ liệu thả xuống.
  • Để xây dựng lại chỉ mục của tất cả các bảng, hãy chọn Bảng và Chế độ xem từ Đối tượng hộp thả xuống.
  • Chọn Sắp xếp kết quả theo tempdb .
  • MAXDOP - đặt 2 (hai).
  • Trong trường hợp của chúng tôi, chúng tôi sẽ chỉ tạo lại các chỉ mục nếu Phân mảnh giá trị cao hơn 20%. Do đó, hãy đặt 20 trong trường tương ứng.
  • Nhấp vào OK để lưu cấu hình chỉ mục và đóng Nhiệm vụ xây dựng lại chỉ mục cửa sổ.

Bây giờ, hãy để chúng tôi định cấu hình lịch biểu.

Nhấp vào lịch biểu tượng trên đầu trình thiết kế kế hoạch bảo trì:

Lịch trình công việc mới cửa sổ sẽ mở ra. Hãy định cấu hình các cài đặt sau:

  • Điều hành công việc mỗi ngày. Trong Loại lịch biểu trình đơn, chúng tôi chọn Định kỳ . Sau đó, trong Tần suất , chúng tôi chọn Xảy ra > Hàng ngày .
  • Lặp lại mọi > 1 (ngày).
  • Tần suất hàng ngày > Xảy ra một lần tại > xác định thời gian chính xác. Trong trường hợp của chúng tôi, bây giờ là 1 giờ sáng.
  • Nhấp vào OK .

Sau đó, lưu kế hoạch bảo trì.

Các kế hoạch bảo trì đã tạo sẵn có trong SSMS Kế hoạch Bảo trì danh mục. Để xem lịch biểu được kết hợp với kế hoạch bảo trì cụ thể, hãy kiểm tra Công việc trong thư mục SQL Server Agent .

Để kiểm tra công việc, hãy nhấp chuột phải vào tên của nó trong Kế hoạch bảo trì và chọn Thực thi từ menu:

Việc thực thi bắt đầu. Khi hoàn tất thành công, bạn sẽ thấy hộp thoại sau:

Đây là phương pháp phổ biến để xây dựng lại các chỉ mục với các kế hoạch bảo trì. Bây giờ, hãy chuyển sang phương pháp tiếp theo - sử dụng các tập lệnh T-SQL.

2. Tạo lại SQL Server ALTER INDEX

Lệnh ALTER INDEX có thể được sử dụng để xây dựng lại tất cả các chỉ mục của bảng. Cú pháp như sau:

ALTER INDEX ALL ON [table_name] REBUILD

Lưu ý: table_name tham số chỉ định tên của bảng mà chúng tôi muốn xây dựng lại tất cả các chỉ mục trong SQL Server.

Ví dụ:chúng tôi muốn xây dựng lại tất cả các chỉ mục của [Nguồn nhân lực]. [Nhân viên] . Truy vấn phải như sau:

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

3. Tập lệnh SQL Server để tạo lại tất cả chỉ mục cho tất cả các bảng dựa trên phân mảnh

Việc duy trì chỉ mục đòi hỏi nhiều tài nguyên. Bên cạnh đó, nó khóa bảng nơi nó đang xây dựng lại chỉ mục. Để tránh những phức tạp như vậy, chúng ta phải xây dựng lại chỉ mục mà chỉ mục SQL Server bị phân mảnh cao hơn 40%.

Để minh họa trường hợp này, tôi đã tạo một tập lệnh T-SQL xây dựng lại các chỉ mục với mức độ phân mảnh cao hơn 30%. Hãy cùng khám phá các bộ phận và chức năng của nó.

Khai báo biến và bảng tạm thời

Đầu tiên, chúng ta cần tạo các bảng và biến tạm thời:

  • @IndexFregQuery - lưu trữ truy vấn động được sử dụng để điền các chỉ mục bị phân mảnh.
  • @IndexRebuildQuery - giữ truy vấn ALTER INDEX.
  • @IndexName - tên chỉ mục mà chúng tôi muốn xây dựng lại
  • @TableName - tên bảng mà chúng ta muốn xây dựng lại chỉ mục.
  • @SchemaName - tên giản đồ mà chúng tôi muốn xây dựng lại chỉ mục.
  • #Fregmentedindex - bảng 3 cột lưu trữ tên chỉ mục, tên bảng và tên lược đồ.

Đoạn mã sau khai báo các biến của chúng ta và bảng tạm thời:

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

Nhận danh sách các chỉ mục được phân mảnh

Bước tiếp theo của chúng tôi là điền danh sách các chỉ mục có mức độ phân mảnh từ 30% trở lên. Chúng tôi phải chèn các chỉ mục đó vào #FregmentedIndexes bảng.

Truy vấn phải điền tên lược đồ, tên bảng và tên chỉ mục để chèn chúng vào bảng tạm thời. Hãy xem truy vấn đó:

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

Tạo một truy vấn SQL động

Cuối cùng, chúng ta phải tạo ALTER INDEX động ra lệnh và thực thi nó.

Để tạo lệnh, chúng tôi đang sử dụng vòng lặp WHILE. Nó lặp lại qua #FregmentedIndexes bảng và điền tên giản đồ, tên bảng và tên chỉ mục để lưu chúng trong @SchemaName , @TableName @IndexName . Các giá trị của tham số được thêm vào lệnh ALTER INDEX.

Mã như sau:

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

Tôi đã đóng gói toàn bộ mã trong sp_index_maintenance thủ tục được lưu trữ được tạo trong DBATools cơ sở dữ liệu. Đoạn mã như sau:

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

Khi thủ tục đã sẵn sàng, chúng ta có thể định cấu hình Công việc SQL.

Mở rộng Tác nhân SQL Server > nhấp chuột phải vào Công việc > Công việc mới .

Công việc mới cửa sổ mở ra nơi bạn nên chỉ định tên công việc mong muốn.

Để tạo một bước công việc, hãy điều hướng đến Các bước > phần Mới nút:

Bạn sẽ đến Bước công việc mới cửa sổ để định cấu hình bước đó.

Nhập tên bước mong muốn và nhập mã sau vào hộp văn bản:

use DBATools
go
exec sp_index_maintenance_daily 'AdventureWorks2017'

Để định cấu hình lịch biểu, hãy chuyển đến Lịch biểu > nhấp vào Mới .

Công việc của chúng tôi sẽ được thực hiện lúc 1:00 sáng. Theo đó, chúng tôi định cấu hình lịch trình:

  • Loại lịch biểu > Định kỳ .
  • Tần suất phần> Xảy ra > Hàng ngày ; Lặp lại mọi > 1 (một).
  • Tần suất hàng ngày phần> Xảy ra một lần tại > 01:00:00.
  • Nhấp vào OK .

Bạn sẽ được chuyển trở lại Công việc mới tiết diện. Nhấp vào OK ở đó nữa để tạo công việc.

Công việc mới được tạo có sẵn trong Việc làm trong thư mục SQL Server Agent thư mục.

Bây giờ chúng ta cần kiểm tra công việc:nhấp chuột phải vào nó và chọn Bắt đầu công việc…

Công việc bắt đầu và khi hoàn thành thành công, bạn sẽ thấy thông báo sau:

Nếu chúng ta so sánh chỉ mục được phân nhóm với chỉ mục không được phân cụm, chúng ta sẽ thấy rằng việc tạo chỉ mục được phân nhóm duy nhất làm tăng hiệu quả của hiệu suất truy vấn. Các dạng xem được lập chỉ mục trong SQL Server có thể được sử dụng để tăng tốc độ thực thi truy vấn. Ngoài ra, hãy xem cách quản lý chỉ mục bằng Trình quản lý chỉ mục SQL.

Tóm tắt

Bài viết hiện tại đã trình bày ba cách chức năng để xây dựng lại các chỉ mục của tất cả các bảng. Chúng tôi đã khám phá tất cả chúng với hướng dẫn từng bước và các ví dụ chỉ mục SQL thực tế để minh họa cấu hình công việc. Sự lựa chọn biến thể phù hợp là của bạn và chúng tôi hy vọng rằng bài viết này sẽ giúp ích cho bạn.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sự khác biệt giữa sys.objects, sys.system_objects và sys.all_objects trong SQL Server

  2. Ví dụ về CTE và đệ quy của SQL Server

  3. Trả lại tên đăng nhập hiện tại trong SQL Server (T-SQL)

  4. Tạo chỉ mục chuỗi với Mã trước tiên

  5. Cách đặt tùy chọn maxrecursion cho một CTE bên trong một Table-Valued-Function