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

11 Phương pháp hay nhất về chỉ mục SQL Server để cải thiện hiệu suất

Trong bài viết trước, chúng ta đã khám phá các yêu cầu về chỉ mục của SQL Server và các cân nhắc về hiệu suất. Khi nói đến hiệu suất cơ sở dữ liệu, điều chỉnh hiệu suất là không cần bàn cãi, một trong những chức năng quan trọng và phức tạp nhất. Nó bao gồm nhiều lĩnh vực khác nhau như tối ưu hóa truy vấn SQL, điều chỉnh chỉ mục và điều chỉnh tài nguyên hệ thống, tất cả đều cần được thực hiện chính xác để truy xuất thành công dữ liệu một cách nhanh chóng.

Có một số lĩnh vực quan trọng cần xem xét khi nói đến chỉ mục SQL Server, vì chúng có thể có tác động đáng kể đến cả nỗ lực điều chỉnh hiệu suất của bạn và hiệu suất cơ sở dữ liệu tổng thể. Dưới đây là một số chi tiết về từng loại và vai trò quan trọng của chúng.

Các phương pháp hay nhất về lập chỉ mục SQL Server

1. Hiểu cách thiết kế cơ sở dữ liệu ảnh hưởng đến chỉ mục SQL Server

Các yêu cầu lập chỉ mục khác nhau giữa cơ sở dữ liệu xử lý giao dịch trực tuyến (OLTP) và xử lý phân tích trực tuyến (OLAP).

Trong cơ sở dữ liệu OLTP, người dùng thực hiện các thao tác đọc-ghi thường xuyên, chèn dữ liệu mới và sửa đổi dữ liệu hiện có. Chúng sử dụng các truy vấn ngôn ngữ thao tác dữ liệu (Chèn, Cập nhật, Xóa) cùng với các câu lệnh Chọn để truy xuất và sửa đổi dữ liệu. Đối với cơ sở dữ liệu OLTP, tốt nhất nên tạo chỉ mục trên cột Đã chọn của bảng. Nhiều chỉ mục có thể có tác động tiêu cực đến hiệu suất và gây căng thẳng cho tài nguyên hệ thống. Thay vào đó, bạn nên tạo số lượng chỉ mục tối thiểu có thể đáp ứng các yêu cầu lập chỉ mục của bạn. Mặt khác, trong cơ sở dữ liệu OLAP, bạn chủ yếu sử dụng các câu lệnh Chọn để truy xuất dữ liệu cho các mục đích phân tích sâu hơn. Trong trường hợp này, bạn có thể thêm nhiều chỉ mục hơn với nhiều cột chính cho mỗi chỉ mục. Bạn cũng có thể tận dụng các chỉ mục columnstore để truy xuất dữ liệu nhanh hơn trong các truy vấn kho dữ liệu

2. Tạo chỉ mục cho các yêu cầu khối lượng công việc của bạn

Khi tạo một bảng mới trong cơ sở dữ liệu của bạn, đừng chỉ thêm các chỉ mục một cách mù quáng. Đôi khi, các nhà phát triển đặt một chỉ mục được phân nhóm và một vài chỉ mục không được phân cụm vào đó mà không cần tìm kiếm các truy vấn sử dụng các chỉ mục đó. Có thể có một chỉ mục không đáp ứng yêu cầu của trình tối ưu hóa truy vấn; do đó, bạn nên phân tích đúng khối lượng công việc và các truy vấn SQL của mình (các thủ tục, hàm, dạng xem và truy vấn đặc biệt được lưu trữ). Bạn có thể nắm bắt khối lượng công việc bằng cách sử dụng trình biên dịch SQL, sự kiện mở rộng và chế độ xem quản lý động, sau đó tạo chỉ mục để tối ưu hóa các truy vấn sử dụng nhiều tài nguyên.

3. Tạo chỉ mục cho các truy vấn được sử dụng nhiều và thường xuyên nhất

Điều quan trọng là phải nhóm khối lượng công việc cho các truy vấn được sử dụng nhiều nhất trong hệ thống của bạn. Bằng cách tạo các chỉ mục tốt nhất cho các truy vấn này, nó sẽ ít gây căng thẳng nhất cho hệ thống của bạn.

4. Áp dụng các phương pháp hay nhất về cột chỉ mục của SQL Server

Vì bạn có thể có nhiều cột trong một bảng, nên đây là một số cân nhắc đối với các cột chính của chỉ mục.

  • Không thể sử dụng các cột có văn bản, hình ảnh, ntext, varchar (max), nvarchar (max) và varbinary (max) trong các cột khóa chỉ mục.
  • Bạn nên sử dụng kiểu dữ liệu số nguyên trong cột khóa chỉ mục. Nó có yêu cầu không gian thấp và hoạt động hiệu quả. Do đó, bạn sẽ muốn tạo cột khóa chính, thường là trên kiểu dữ liệu số nguyên.
  • Bạn chỉ có thể sử dụng kiểu dữ liệu XML trong chỉ mục XML.
  • Bạn nên cân nhắc việc tạo khóa chính cho cột với các giá trị duy nhất. Nếu một bảng không có bất kỳ cột giá trị duy nhất nào, bạn có thể xác định cột nhận dạng cho kiểu dữ liệu số nguyên. Khóa chính cũng tạo chỉ mục theo nhóm để phân phối hàng.
  • Bạn có thể coi một cột có giá trị Duy nhất và Không ĐẦY ĐỦ là một ứng cử viên khóa chỉ mục hữu ích.
  • Bạn nên xây dựng chỉ mục dựa trên các vị từ trong mệnh đề Where. Ví dụ:bạn có thể xem xét các cột được sử dụng trong mệnh đề Where, các phép nối trong SQL, như, sắp xếp theo thứ tự, nhóm theo vị từ, v.v.
  • Bạn nên nối các bảng theo cách làm giảm số hàng cho phần còn lại của truy vấn. Điều này sẽ giúp trình tối ưu hóa truy vấn chuẩn bị kế hoạch thực thi với tài nguyên hệ thống tối thiểu.
  • Nếu bạn sử dụng nhiều cột cho một khóa chỉ mục, bạn cũng cần xem xét vị trí của chúng trong khóa chỉ mục.
  • Bạn cũng nên cân nhắc sử dụng các cột được bao gồm trong chỉ mục của mình.

5. Phân tích phân phối dữ liệu của các cột chỉ mục SQL Server của bạn

Bạn nên kiểm tra phân phối dữ liệu trong các cột khóa chỉ mục của SQL Server. Một cột có các giá trị không phải là duy nhất có thể gây ra sự chậm trễ trong việc truy xuất dữ liệu và dẫn đến một giao dịch kéo dài. Bạn có thể phân tích phân phối dữ liệu bằng cách sử dụng biểu đồ trong thống kê.

6. Sử dụng thứ tự sắp xếp dữ liệu

Bạn cũng nên xem xét các yêu cầu sắp xếp dữ liệu trong các truy vấn và chỉ mục của mình. Theo mặc định, SQL Server sắp xếp dữ liệu theo thứ tự tăng dần trong một chỉ mục. Giả sử bạn tạo một chỉ mục theo thứ tự tăng dần, nhưng các truy vấn của bạn sử dụng mệnh đề Order By để sắp xếp dữ liệu theo thứ tự giảm dần.

Ví dụ:hãy xem kế hoạch thực thi thực tế của truy vấn sau.

SELECT [SalesOrderID],
[UnitPrice]
FROM [AdventureWorks].[Sales].[SalesOrderDetail]
ORDER BY UnitPrice DESC,
SalesOrderID ASC;

Nó sử dụng toán tử sắp xếp tốn kém với tổng chi phí là 90% trong truy vấn này. Chúng tôi quyết định tạo chỉ mục không phân cụm trên [UnitPrice] và [SalesOrderID]. Nó sử dụng một thứ tự sắp xếp mặc định cho cả hai cột trong chỉ mục.

CREATE NONCLUSTERED INDEX IX_SalesOrderDetail_Unitprice
ON [AdventureWorks].[Sales].[SalesOrderDetail]
(UnitPrice ASC, SalesOrderID ASC);

Chúng tôi đã chạy lại câu lệnh Chọn và trình tối ưu hóa truy vấn vẫn sử dụng toán tử sắp xếp. Nó có thể sử dụng chỉ mục không phân cụm nhưng sắp xếp dữ liệu để chuẩn bị kết quả.

Hãy tạo lại chỉ mục bằng cách sử dụng truy vấn sau. Lần này, nó sắp xếp dữ liệu theo thứ tự giảm dần cho [Unitprice] trong định nghĩa chỉ mục.

DROP INDEX IX_SalesOrderDetail_Unitprice ON [AdventureWorks].[Sales].[SalesOrderDetail];
Go 
CREATE NONCLUSTERED INDEX IX_SalesOrderDetail_Unitprice ON [AdventureWorks].[Sales].[SalesOrderDetail](UnitPrice DESC, SalesOrderID ASC);
Go

Nó không yêu cầu bất kỳ toán tử sắp xếp nào vì chỉ mục đáp ứng các yêu cầu truy vấn.

7. Sử dụng khóa ngoại cho chỉ mục SQL Server của bạn

Bạn nên tạo một chỉ mục trên các cột khóa ngoại. Bạn nên tạo chỉ mục được phân cụm trên khóa ngoại để cải thiện hiệu suất truy vấn.

8. Hãy lưu ý đến các cân nhắc về lưu trữ chỉ mục của SQL Server

Lưu trữ chỉ mục cũng là một khía cạnh hữu ích để xem xét. SQL Server tạo tất cả các chỉ mục trên cùng một nhóm tệp của bảng. Bạn có thể xem xét một nhóm tệp riêng biệt cho các chỉ mục và tách tệp vật lý trên một đĩa riêng biệt. Điều này sẽ tăng hiệu suất và thông lượng IO.

Tương tự, bạn có thể sử dụng phân vùng bảng để tách biệt dữ liệu trên nhiều đĩa và nhóm tệp. Bạn có thể thiết kế các chỉ mục được phân vùng cho các phân vùng bảng này để cải thiện khả năng truy cập dữ liệu đồng thời.

Một tùy chọn khác là xác định FILLFACTOR trong khi tạo hoặc xây dựng lại một chỉ mục. FILLFACTOR xác định không gian trống trong các trang dữ liệu nút lá. Nó rất hữu ích cho việc chèn thêm dữ liệu. Nếu dữ liệu của bạn là tĩnh và không thường xuyên thay đổi, bạn có thể xem xét một giá trị cao của FILLFACTOR. Mặt khác, đối với dữ liệu thường xuyên thay đổi, bạn có thể để lại đủ chỗ cho việc chèn dữ liệu mới.

9. Tìm các chỉ mục bị thiếu

Đôi khi, bạn nhận được thông tin về chỉ mục SQL Server bị thiếu trong kế hoạch thực thi truy vấn. Bạn cũng có thể chạy các dạng xem quản lý động để tìm các chỉ mục bị thiếu này. Bạn không nên tạo các chỉ mục này một cách mù quáng. Nó chỉ đơn thuần là một đề xuất của trình tối ưu hóa truy vấn, nhưng nó không xem xét chỉ mục hiện có hoặc các yêu cầu về khối lượng công việc của bạn. Nó cũng có thể bao gồm nhiều cột trong định nghĩa chỉ mục, vì vậy hãy xem lại những đề xuất này trước khi triển khai nó.

10. Luôn tạo chỉ mục được phân nhóm trước chỉ mục không được phân nhóm

Theo hướng dẫn chung, bạn nên tạo một chỉ mục theo nhóm trước khi xây dựng các chỉ mục không theo nhóm. Nếu bảng không có chỉ mục, thì chỉ mục không phân cụm bao gồm các định danh hàng. Sau khi bạn tạo chỉ mục được phân cụm, SQL Server cần xây dựng lại các chỉ mục không được phân cụm này để chúng có thể trỏ đến khóa chỉ mục được phân nhóm thay vì số nhận dạng hàng.

11. Theo dõi số liệu thống kê cập nhật và duy trì chỉ mục

Dưới đây là một số khu vực bảo trì cần theo dõi khi nói đến chỉ mục SQL Server.

  • Xóa phân mảnh chỉ mục :Bạn nên thường xuyên xem xét các phân mảnh bên trong và bên ngoài, đặc biệt là đối với các bảng giao dịch cao. Các truy vấn của bạn có thể phản hồi chậm ngay cả khi bạn có chỉ mục phù hợp cho khối lượng công việc của mình. Chỉ mục bị phân mảnh nhiều có thể làm giảm hiệu suất vì nó yêu cầu IO bổ sung. Bạn có thể tổ chức lại hoặc xây dựng lại một chỉ mục dựa trên các giá trị phân mảnh của nó. Thông thường, bạn nên xây dựng lại chỉ mục nếu nó có độ phân mảnh lớn hơn 30% và sắp xếp lại nó nếu nó có độ phân mảnh nhỏ hơn 30%.
  • Xóa các chỉ mục không sử dụng: Bạn nên luôn xem xét các chỉ mục không sử dụng (nhàn rỗi) trong cơ sở dữ liệu của mình vì trình tối ưu hóa truy vấn cần phải xem xét chúng cho mỗi truy vấn. Chỉ mục không sử dụng cũng tiêu tốn dung lượng lưu trữ và tăng chi phí bảo trì.
  • Cập nhật thống kê: Bạn nên cập nhật thống kê định kỳ ngay cả khi bạn đã đặt thống kê tự động cập nhật trong cấu hình cơ sở dữ liệu của mình. Trình tối ưu hóa truy vấn có thể chuẩn bị một kế hoạch thực thi không tốt nếu thống kê chỉ mục không được cập nhật. Bạn có thể lên lịch công việc đại lý để cập nhật số liệu thống kê của SQL Server với quá trình quét toàn bộ sau giờ làm việc.

Bạn có thể tham khảo bảo trì chỉ mục SQL để có thêm hiểu biết về chủ đề này.

Áp dụng các phương pháp hay nhất về chỉ mục SQL Server

Mặc dù, không phải lúc nào cũng có cách đơn giản để thiết kế chỉ mục SQL Server tối ưu, việc áp dụng các khuyến nghị được chỉ định trong bài đăng này sẽ giúp bạn điều hướng các yêu cầu lập chỉ mục khác nhau mà bạn sẽ gặp phải với từng loại cơ sở dữ liệu và khối lượng công việc của nó. Các phương pháp hay nhất này sẽ giúp tối ưu hóa các chỉ mục của bạn để cải thiện hiệu suất cơ sở dữ liệu và đảm bảo quá trình điều chỉnh hiệu suất diễn ra suôn sẻ hơ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. Sao lưu / khôi phục SQL Server so với tách / đính kèm

  2. Cách xem nhiều truy vấn và kết quả song song trong SQL Server Management Studio (SSMS) - Hướng dẫn sử dụng SQL Server / TSQL Phần 14

  3. Dấu thời gian trong T-Sql trong C # có nghĩa là gì?

  4. SYSDATETIME () Ví dụ trong SQL Server (T-SQL)

  5. WHERE IN (mảng ID)