Giới thiệu về Chỉ mục Máy chủ SQL
Microsoft SQL Server được coi là một trong những hệ thống quản lý cơ sở dữ liệu quan hệ ( RDBMS ), trong đó dữ liệu được tổ chức hợp lý thành các hàng và cột được lưu trữ trong các vùng chứa dữ liệu được gọi là bảng. Về mặt vật lý, các bảng được lưu trữ dưới dạng 8 KB trang có thể được tổ chức thành các bảng Heap hoặc B-Tree Clustered. Trong Heap bảng, không có thứ tự sắp xếp nào kiểm soát thứ tự của dữ liệu bên trong các trang dữ liệu và trình tự của các trang trong bảng đó, vì không có chỉ mục Clustered được xác định trên bảng đó để thực thi cơ chế sắp xếp. Nếu chỉ mục Clustered được xác định trên một cột của nhóm cột bảng, dữ liệu sẽ được sắp xếp bên trong các trang dữ liệu dựa trên giá trị của các cột khóa chỉ mục Clustered và các trang sẽ được liên kết với nhau dựa trên các giá trị khóa chỉ mục này. Bảng được sắp xếp này được gọi là Bảng được phân nhóm .
Trong SQL Server, chỉ mục được coi là một chìa khóa quan trọng và hiệu quả trong quá trình điều chỉnh hiệu suất. Mục đích của việc tạo chỉ mục là để tăng tốc độ truy cập vào bảng cơ sở và truy xuất dữ liệu được yêu cầu mà không cần phải quét tất cả các hàng của bảng để trả về dữ liệu được yêu cầu. Bạn có thể coi chỉ mục cơ sở dữ liệu như một mục lục sách giúp bạn nhanh chóng tìm thấy các từ trong sách, mà không cần phải đọc toàn bộ cuốn sách để tìm từ đó. Ví dụ:giả sử bạn cần truy xuất thông tin về một khách hàng cụ thể bằng cách sử dụng ID khách hàng. Nếu không có chỉ mục nào được xác định cho cột ID khách hàng trong bảng này, SQL Server Engine sẽ kiểm tra tất cả các hàng trong bảng, từng hàng một, để truy xuất khách hàng có ID được cung cấp. Nếu một chỉ mục được xác định cho cột ID khách hàng trong bảng này, SQL Server Engine sẽ tìm kiếm các giá trị ID khách hàng được yêu cầu trong chỉ mục được sắp xếp, thay vì trong bảng cơ sở, để truy xuất thông tin về khách hàng, giảm số lần quét hàng để truy xuất dữ liệu.
Trong SQL Server, chỉ mục được cấu trúc một cách logic dưới dạng 8K trang, hoặc các nút chỉ mục, dưới dạng một cây B. Cấu trúc B-Tree có ba cấp độ:a Cấp độ gốc bao gồm một trang chỉ mục ở đầu cây B, Cấp lá nằm ở cuối cây B và chứa các trang dữ liệu và Cấp trung gian bao gồm tất cả các nút nằm giữa cấp độ gốc và cấp độ lá, với các giá trị khóa chỉ mục và con trỏ đến các trang sau. Hình dạng cây B này cung cấp một cách nhanh chóng để điều hướng các trang dữ liệu từ trái sang phải và từ trên xuống dưới, dựa trên phím chỉ mục.
Trong SQL Server, có hai loại chỉ mục chính, Chỉ mục được phân cụm, trong đó dữ liệu thực tế được lưu trữ ở các trang cấp độ lá của chỉ mục, với khả năng chỉ tạo một chỉ mục nhóm cho mỗi bảng, vì dữ liệu bên trong các trang dữ liệu và thứ tự của các trang sẽ được sắp xếp dựa trên chỉ mục được phân nhóm Chìa khóa. Nếu bạn xác định ràng buộc khóa chính trong bảng của mình, một chỉ mục theo nhóm sẽ được tạo tự động nếu trước đó không có chỉ mục được phân cụm nào được xác định cho bảng đó. Loại chỉ mục thứ hai là Chỉ mục không phân cụm bao gồm bản sao được sắp xếp của các cột khóa chỉ mục và một con trỏ đến phần còn lại của các cột trong bảng cơ sở hoặc chỉ mục theo nhóm, với khả năng tạo tối đa 999 chỉ mục không theo nhóm cho mỗi bảng.
SQL Server cung cấp cho chúng tôi các loại chỉ mục đặc biệt khác, chẳng hạn như Chỉ mục duy nhất được tạo tự động khi một ràng buộc duy nhất được xác định để thực thi tính duy nhất của các giá trị cột cụ thể, Chỉ mục tổng hợp trong đó nhiều cột chính sẽ tham gia vào khóa chỉ mục, một Chỉ mục bao gồm trong đó tất cả các cột được yêu cầu bởi một truy vấn cụ thể sẽ tham gia vào khóa chỉ mục, một Chỉ mục được lọc đó là chỉ mục không phân cụm được tối ưu hóa với vị từ bộ lọc để chỉ lập chỉ mục một phần nhỏ của các hàng trong bảng, Chỉ mục không gian được tạo trên các cột lưu trữ dữ liệu không gian, một chỉ mục XML được tạo trên các đối tượng lớn nhị phân XML (BLOB) trong các cột kiểu dữ liệu XML, một Chỉ mục Columnstore trong đó dữ liệu được tổ chức theo định dạng dữ liệu cột, một Chỉ mục toàn văn được tạo bởi SQL Server Full-Text Engine và Chỉ mục băm được sử dụng trong các bảng Tối ưu hóa Bộ nhớ.
Như tôi thường gọi là chỉ mục SQL Server, đây là con dao hai lưỡi , trong đó SQL Server Query Optimizer có thể hưởng lợi từ chỉ mục được thiết kế tốt để cải thiện hiệu suất của các ứng dụng của bạn bằng cách tăng tốc quá trình truy xuất dữ liệu. Ngược lại, một chỉ mục được thiết kế theo cách xấu sẽ không được Trình tối ưu hóa truy vấn SQL Server chọn và nó sẽ làm giảm hiệu suất của các ứng dụng của bạn bằng cách làm chậm hoạt động sửa đổi dữ liệu và tiêu tốn dung lượng của bạn mà không tận dụng được nó trong dữ liệu các quy trình truy xuất. Do đó, tốt hơn hết là trước tiên bạn nên tuân theo các nguyên tắc và thực tiễn tốt nhất về tạo chỉ mục, kiểm tra hiệu quả nếu tạo chỉ mục trên môi trường phát triển và tìm ra sự thỏa hiệp giữa tốc độ của các hoạt động truy xuất dữ liệu và chi phí của việc thêm chỉ mục đó vào các hoạt động sửa đổi dữ liệu và các yêu cầu về không gian của chỉ mục đó, trước khi áp dụng nó vào môi trường sản xuất.
Trước khi tạo chỉ mục, bạn cần nghiên cứu các khía cạnh khác nhau ảnh hưởng đến việc tạo và sử dụng chỉ mục. Điều này bao gồm loại khối lượng công việc của cơ sở dữ liệu, Xử lý giao dịch trực tuyến (OLTP) hoặc Xử lý phân tích trực tuyến (OLAP), kích thước của bảng , các đặc điểm của cột trong bảng , thứ tự sắp xếp của các cột trong truy vấn, loại chỉ mục tương ứng với truy vấn và các thuộc tính lưu trữ, chẳng hạn như FILLFACTOR và PAD_INDEX các tùy chọn kiểm soát phần trăm không gian trên mỗi trang cấp độ lá và cấp độ trung gian được lấp đầy bởi dữ liệu.
Phân mảnh chỉ mục máy chủ SQL
Công việc của bạn với tư cách là một DBA không bị giới hạn trong việc tạo chỉ mục phù hợp. Khi chỉ mục được tạo, bạn nên theo dõi việc sử dụng chỉ mục và số liệu thống kê, ví dụ, bạn cần biết liệu chỉ mục này có được sử dụng kém hay không. Do đó, bạn có thể đưa ra giải pháp chính xác để duy trì các chỉ mục này hoặc thay thế chúng bằng các chỉ mục hiệu quả hơn. Bằng cách này, bạn sẽ duy trì hiệu suất áp dụng cao nhất cho hệ thống của mình. Bạn có thể tự hỏi mình:Tại sao Trình tối ưu hóa Truy vấn SQL Server không còn sử dụng chỉ mục của tôi nữa, mặc dù nó đã làm điều đó trước đây?
Câu trả lời chủ yếu liên quan đến các thay đổi dữ liệu và lược đồ liên tục được thực hiện trên bảng cơ sở cần được phản ánh trong các chỉ mục. Theo thời gian, và với tất cả những thay đổi này, các trang chỉ mục trở nên không được sắp xếp, khiến chỉ mục bị phân mảnh. Một lý do khác cho sự phân mảnh là cố gắng chèn một giá trị mới hoặc cập nhật giá trị hiện tại và giá trị mới không vừa với dung lượng trống hiện có. Trong trường hợp này, trang sẽ được chia thành hai trang, nơi trang mới sẽ được tạo vật lý sau trang cuối cùng. Và bạn có thể tưởng tượng việc đọc từ một chỉ mục bị phân mảnh và số lượng trang cần được quét, và tất nhiên, số lượng hoạt động I / O được thực hiện để truy xuất một số bản ghi do khoảng cách giữa các trang này. Và do chi phí bổ sung của việc sử dụng chỉ mục bị phân mảnh này, Trình tối ưu hóa truy vấn SQL Server sẽ bỏ qua chỉ mục này.
Các cách khác nhau để nhận phân mảnh chỉ mục
SQL Server cung cấp cho chúng ta những cách khác nhau để lấy phần trăm phân mảnh chỉ mục. Cách đầu tiên là kiểm tra phần trăm phân mảnh chỉ mục trong Chỉ mục Thuộc tính trong cửa sổ Phân mảnh như được hiển thị bên dưới:
Nhưng để kiểm tra mức độ phân mảnh của nhiều chỉ mục, trước tiên bạn cần thực hiện kiểm tra phương pháp giao diện người dùng cho tất cả các chỉ mục, từng chỉ mục, đây là một thao tác lãng phí thời gian. Phương pháp thứ hai có sẵn để kiểm tra mức độ phân mảnh của tất cả các chỉ mục cơ sở dữ liệu là truy vấn DMF sys.dm_db_index_physical_stats và kết hợp nó với DMV sys.indexes để truy xuất tất cả thông tin về các chỉ mục này, lưu ý rằng các thống kê này sẽ được làm mới khi Dịch vụ SQL Server được khởi động lại, sử dụng truy vấn tương tự như sau:
SELECT Indx.name AS Index_Name, OBJECT_NAME(Indx.OBJECT_ID) AS Source_Table_Name, Index_Stat.index_type_desc AS TypeOfIndex, Index_Stat.avg_fragmentation_in_percent Index_Fragmentation_Percentage FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) Index_Stat INNER JOIN sys.indexes Indx ON Indx.object_id = Index_Stat.object_id AND Indx.index_id = Index_Stat.index_id ORDER BY Index_Fragmentation_Percentage DESC
Kết quả đầu ra của truy vấn AdventureWorks2016CTP3 cơ sở dữ liệu thử nghiệm sẽ tương tự như sau:
Phương pháp thứ ba để nhận phần trăm phân mảnh là sử dụng báo cáo tiêu chuẩn được tích hợp sẵn của SQL Server được gọi là Thống kê vật lý chỉ mục. Báo cáo này trả về thông tin hữu ích về các phân vùng chỉ mục, phần trăm phân mảnh, số trang trên mỗi phân vùng chỉ mục và các đề xuất về cách khắc phục sự cố phân mảnh chỉ mục bằng cách xây dựng lại hoặc tổ chức lại chỉ mục. Để xem báo cáo, hãy nhấp chuột phải vào cơ sở dữ liệu của bạn, chọn tùy chọn Báo cáo, Báo cáo Chuẩn và chọn Chỉ mục Thống kê Vật lý như bên dưới:
Trong trường hợp của chúng tôi, báo cáo đã tạo sẽ giống như sau:
Cách cuối cùng và dễ nhất để truy xuất phần trăm phân mảnh của tất cả các chỉ mục cơ sở dữ liệu là công cụ Trình quản lý chỉ mục dbForge. Trình quản lý chỉ mục dbForge công cụ là một phần bổ trợ có thể được thêm vào SQL Server Management Studio của bạn để phân tích chỉ mục cơ sở dữ liệu SQL Server, cung cấp cho bạn một báo cáo rất hữu ích với trạng thái của các chỉ mục cơ sở dữ liệu đã chọn và đề xuất bảo trì để khắc phục các vấn đề phân mảnh chỉ mục này.
Sau khi cài đặt phần bổ trợ dbForge Index Manager vào SSMS của bạn, bạn có thể chạy nó bằng cách nhấp chuột phải vào cơ sở dữ liệu cần quét, chọn Index Manager , sau đó đến Quản lý phân mảnh chỉ mục như hình dưới đây:
Công cụ quản lý chỉ mục dbForge cho phép bạn có được bức tranh tổng thể về sự phân mảnh của các chỉ mục cơ sở dữ liệu đã chọn, với khuyến nghị về các hành động thích hợp để khắc phục sự cố này, như được hiển thị bên dưới:
Công cụ dbForge Index Manager cho phép bạn chuyển đổi giữa các cơ sở dữ liệu, cung cấp cho bạn một báo cáo mới sau khi quét cơ sở dữ liệu này như được hiển thị bên dưới:
Báo cáo phân mảnh chỉ mục được tạo bởi công cụ Trình quản lý chỉ mục dbForge có thể được xuất sang tệp CSV để phân tích trạng thái phân mảnh chỉ mục, như được hiển thị bên dưới:
dbForge Index Manager cho phép bạn tạo các tập lệnh T-SQL để xây dựng lại hoặc tổ chức lại các chỉ mục theo khuyến nghị của công cụ. Sử dụng Thay đổi tập lệnh để hiển thị hoặc lưu tập lệnh cho các chỉ mục bị phân mảnh, như được hiển thị bên dưới:
Công cụ Trình quản lý chỉ mục dbForge cung cấp cho bạn khả năng khắc phục sự cố phân mảnh chỉ mục trực tiếp bằng cách nhấp vào nút Khắc phục nút sẽ thực hiện hành động được đề xuất trực tiếp trên các chỉ mục đã chọn, hiển thị trạng thái sửa chữa trên Kết quả như hình bên dưới:
Nếu bạn nhấp vào nút Phân tích lại , nó sẽ quét lại phân mảnh chỉ mục trên cơ sở dữ liệu sau khi thực hiện thao tác sửa thành công. Những gì được liệt kê ở đây trong bài viết này chỉ là phần giới thiệu về cách công cụ Trình quản lý chỉ mục dbForge sẽ giúp chúng ta trong việc xác định và khắc phục các vấn đề phân mảnh chỉ mục. Khuyến nghị của tôi dành cho bạn là tải xuống và kiểm tra xem công cụ này có thể cung cấp cho bạn những gì.
Các liên kết hữu ích:
- Khái niệm cơ bản về chỉ mục
- Các loại chỉ mục
- Các chỉ mục được phân nhóm và không gộp được mô tả
- Cấu trúc chỉ mục được phân nhóm
Công cụ hữu ích:
dbForge Index Manager - phần bổ trợ SSMS tiện dụng để phân tích trạng thái của các chỉ mục SQL và khắc phục sự cố với phân mảnh chỉ mục.