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

Các chỉ mục của SQL Server:Các yêu cầu chính, tác động đến hiệu suất và những cân nhắc

Các chỉ mục của SQL Server được sử dụng để giúp truy xuất dữ liệu nhanh hơn và giảm tắc nghẽn ảnh hưởng đến các tài nguyên quan trọng. Các chỉ mục trên bảng cơ sở dữ liệu đóng vai trò như một kỹ thuật tối ưu hóa hiệu suất. Bạn có thể tự hỏi - làm cách nào để các chỉ mục tăng hiệu suất truy vấn? Có những thứ như chỉ số tốt và xấu không? Giả sử bạn có một bảng với 50 cột, bạn có nên tạo chỉ mục trên mỗi cột không? Nếu chúng ta tạo nhiều chỉ mục, nó có giúp truy vấn SQL chạy nhanh hơn không?

Tất cả các câu hỏi tuyệt vời, nhưng trước khi chúng ta đi sâu vào, điều cần thiết là phải biết lý do tại sao các chỉ mục có thể được yêu cầu ngay từ đầu.

Hãy tưởng tượng bạn đến thăm một thư viện thành phố có bộ sưu tập hàng nghìn cuốn sách. Bạn đang tìm kiếm một cuốn sách cụ thể, nhưng bạn sẽ tìm thấy nó như thế nào? Nếu bạn xem qua từng cuốn sách, trong từng giá đỡ, bạn có thể mất nhiều ngày để tìm thấy nó. Điều tương tự cũng áp dụng cho cơ sở dữ liệu khi bạn đang tìm kiếm bản ghi từ hàng triệu hàng được lưu trữ trong bảng.

Chỉ mục SQL Server được định dạng theo định dạng B-Tree bao gồm nút gốc ở trên cùng và nút lá ở dưới cùng. Đối với ví dụ về sách thư viện của chúng tôi, người dùng đưa ra truy vấn để tìm kiếm sách có ID 391. Trong trường hợp này, công cụ truy vấn bắt đầu đi ngang từ nút gốc và chuyển đến nút lá.

Nút gốc -> Nút trung gian -> Nút lá.

Công cụ truy vấn tìm kiếm trang tham chiếu ở cấp độ trung gian. Trong ví dụ này, nút trung gian đầu tiên bao gồm các ID sách từ 1-500 và nút trung gian thứ hai bao gồm 501-1000.

Dựa trên nút trung gian, công cụ truy vấn duyệt qua B-Tree để tìm nút trung gian tương ứng và nút lá. Nút lá này có thể bao gồm dữ liệu thực tế hoặc trỏ đến trang dữ liệu thực tế dựa trên loại chỉ mục. Trong hình ảnh bên dưới, chúng ta thấy cách duyệt qua chỉ mục để tìm kiếm dữ liệu bằng cách sử dụng các chỉ mục của SQL Server. Trong trường hợp này, SQL Server không phải lướt qua từng trang, đọc nó và tìm kiếm nội dung ID sách cụ thể.

Tác động của chỉ mục đến hiệu suất của SQL Server

Trong ví dụ thư viện trước, chúng tôi đã kiểm tra các tác động tiềm năng đến hiệu suất chỉ mục. Hãy xem xét hiệu suất truy vấn có và không có chỉ mục.

Giả sử chúng ta yêu cầu dữ liệu cho [SalesOrderID] 56958 từ bảng [SalesOrderDetail_Demo].

CHỌN *
TỪ [AdventureWorks]. [Bán hàng]. [SalesOrderDetail_Demo]
trong đó SalesOrderID =56958

Bảng này không có bất kỳ chỉ mục nào trên đó. Một bảng không có bất kỳ chỉ mục nào được gọi là bảng heap trong SQL Server.

Từ đây, bạn sẽ muốn chạy câu lệnh select ở trên và xem kế hoạch thực thi thực tế. Bảng này có 121317 bản ghi trong đó. Nó thực hiện quét bảng, có nghĩa là nó đọc tất cả các hàng trong bảng để tìm [SalesOrderID] cụ thể.

Khi bạn di con trỏ qua biểu tượng Quét bảng, nó cho thấy rằng tập hợp kết quả thực tế chứa 2 hàng, nhưng vì mục đích này, nó đọc tất cả các hàng trong bảng đó.

  • Số hàng đã đọc:121317
  • Số hàng thực tế để thực thi:2

Bây giờ, hãy nghĩ về một bảng có hàng triệu hoặc hàng tỷ hàng. Việc xem qua tất cả các bản ghi trong bảng để lọc một vài hàng không phải là một thực tiễn tốt. Trong một hệ thống cơ sở dữ liệu xử lý giao dịch trực tuyến (OLTP) mở rộng, nó không sử dụng tài nguyên máy chủ (CPU, IO, bộ nhớ) một cách hiệu quả, do đó, người dùng có thể gặp phải các vấn đề về hiệu suất.

Bây giờ, hãy chạy câu lệnh select ở trên với bảng có các chỉ mục. Bảng này có chỉ mục được nhóm khóa chính và hai chỉ mục không được phân cụm trên cột [ProductID] và [rowguid]. Chúng ta sẽ nói sau về các loại chỉ mục khác nhau trong SQL Server.

Bây giờ, nếu bạn chạy lại câu lệnh select với cùng một vị từ, kế hoạch thực thi sẽ cho thấy vấn đề về hiệu suất. Trình tối ưu hóa truy vấn quyết định sử dụng tìm kiếm chỉ mục theo nhóm thay vì quét chỉ mục theo nhóm.

Trong chi tiết tìm kiếm chỉ mục được phân nhóm, nó hiển thị trình tối ưu hóa truy vấn đọc chính xác các hàng mà nó đưa ra trong đầu ra.

Để cung cấp cho bạn phân tích so sánh, hãy so sánh kế hoạch thực thi có và không có chỉ mục SQL Server. Bạn có thể tham khảo bài viết Cách so sánh các kế hoạch thực thi truy vấn của SQL Shack trong SQL Server 2016 để có thêm thông tin chi tiết.

Đối với ví dụ này, hãy xem các giá trị được đánh dấu trong tìm kiếm chỉ mục được phân nhóm và quét bảng:

  • Đọc logic:Công cụ cơ sở dữ liệu SQL Server đọc một trang từ bộ đệm đệm và nó gây ra đọc logic. Dưới đây, chúng tôi thấy số lần đọc logic giảm từ 1715 xuống 3 khi bạn tạo chỉ mục.
  • Chi phí CPU ước tính cũng giảm từ 0,133527 xuống 0,00016
  • Chi phí IO ước tính giảm từ 1,27283 xuống 0,003125

Hình ảnh dưới đây cho thấy sự khác biệt giữa quét bảng và tìm kiếm chỉ mục.

Chỉ mục tốt (hữu ích) và chỉ mục xấu trong SQL Server

Như tên cho thấy, một chỉ mục tốt sẽ cải thiện hiệu suất truy vấn và giảm thiểu việc sử dụng tài nguyên. Một chỉ mục có thể làm giảm hiệu suất của các truy vấn trong SQL Server không? Đôi khi chúng tôi tạo chỉ mục trên một cột cụ thể, nhưng nó không bao giờ được sử dụng. Giả sử bạn có một chỉ mục trên một cột và bạn thực hiện rất nhiều lần chèn và cập nhật cho cột đó. Đối với mỗi bản cập nhật, bản cập nhật chỉ mục tương ứng cũng được yêu cầu. Nếu khối lượng công việc của bạn có nhiều hoạt động ghi hơn và bạn có nhiều chỉ mục trên một cột, điều đó sẽ làm chậm hiệu suất tổng thể của các truy vấn của bạn. Một chỉ mục không được sử dụng cũng có thể gây ra hiệu suất chậm cho các câu lệnh được chọn. Trình tối ưu hóa truy vấn sử dụng số liệu thống kê để xây dựng kế hoạch thực thi. Nó đọc tất cả các chỉ mục và lấy mẫu dữ liệu của chúng, và dựa vào đó, nó xây dựng một kế hoạch thực thi truy vấn được tối ưu hóa. Bạn có thể theo dõi việc sử dụng chỉ mục của mình bằng cách sử dụng chế độ xem quản lý động sys.dm_db_index_usage_stats và giám sát các tài nguyên, chẳng hạn như quét người dùng, người dùng tìm kiếm và tra cứu người dùng.

Các loại chỉ mục SQL Server và các cân nhắc

SQL Server có hai chỉ mục chính - chỉ mục được phân cụm và không được phân cụm. Chỉ mục được phân cụm lưu trữ dữ liệu thực tế trong nút lá của chỉ mục. Nó sắp xếp vật lý dữ liệu trong các trang dữ liệu dựa trên khóa chỉ mục được phân cụm. SQL Server cho phép một chỉ mục nhóm trên mỗi bảng. Bạn có thể kết hợp nhiều cột để tạo khóa chỉ mục theo nhóm. Chỉ mục không phân cụm là một chỉ mục logic và nó có cột khóa chỉ mục trỏ đến khóa chỉ mục được phân nhóm.

Chúng ta có thể có các chỉ mục khác trong SQL Server cũng như chỉ mục XML, chỉ mục lưu trữ cột, chỉ mục không gian, chỉ mục toàn văn, chỉ mục băm, v.v.

Bạn nên xem xét các điểm sau trước khi xây dựng chỉ mục trong SQL Server:

  • Khối lượng công việc
  • Cột bắt buộc phải có chỉ mục
  • Kích thước bảng
  • Thứ tự tăng dần hoặc giảm dần của dữ liệu cột
  • Thứ tự cột
  • Loại chỉ mục
  • Hệ số điền, chỉ số đệm và thứ tự sắp xếp TempDB

Lợi ích, hàm ý và khuyến nghị của chỉ mục SQL Server

Các chỉ mục trong cơ sở dữ liệu có thể là một con dao hai lưỡi. Chỉ mục SQL Server hữu ích nâng cao hiệu suất truy vấn và hệ thống mà không ảnh hưởng đến các truy vấn khác. Mặt khác, nếu bạn tạo một chỉ mục mà không có bất kỳ sự chuẩn bị hoặc cân nhắc nào, nó có thể gây ra suy giảm hiệu suất, truy xuất dữ liệu chậm và có thể tiêu tốn nhiều tài nguyên quan trọng hơn như CPU, IO và bộ nhớ. Các chỉ mục cũng làm tăng nhiệm vụ bảo trì cơ sở dữ liệu của bạn. Lưu ý những yếu tố này, tốt nhất bạn nên kiểm tra một chỉ số thích hợp trong môi trường tiền sản xuất với khối lượng công việc sản xuất tương đương, sau đó phân tích hiệu suất và quyết định xem liệu có nên triển khai nó trên cơ sở dữ liệu sản xuất hay không. Có nhiều đề xuất khác cần tính đến, hãy xem 11 phương pháp hay nhất về chỉ mục hàng đầu của tôi để có thêm thông tin chi tiết.


  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ử dụng sp_help_jobschedule trong SQL Server

  2. Hiệu suất tổng hợp có điều kiện

  3. Cách nhanh nhất để xóa các ký tự không phải số khỏi VARCHAR trong SQL Server

  4. Sự khác biệt giữa Bảo mật Tích hợp =Đúng và Bảo mật Tích hợp =SSPI là gì?

  5. Lỗi máy chủ SQL 110:Có ít cột trong câu lệnh INSERT hơn giá trị được chỉ định trong mệnh đề VALUES.