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

Tại sao đây là Quét lập chỉ mục mà không phải là Tìm kiếm chỉ mục?

Nó chủ yếu sử dụng Index Scan vì nó cũng đang sử dụng Merge Join. Toán tử kết hợp kết hợp yêu cầu hai luồng đầu vào được sắp xếp theo thứ tự tương thích với các điều kiện kết hợp.

Và nó đang sử dụng toán tử Merge Join để nhận ra INNER JOIN của bạn vì nó tin rằng điều đó sẽ nhanh hơn toán tử Tham gia vòng lặp lồng nhau thông thường hơn. Và nó có thể đúng (thường là như vậy), bằng cách sử dụng hai chỉ mục mà nó đã chọn, nó có các luồng đầu vào được sắp xếp trước theo điều kiện tham gia của bạn (LocationID). Khi các luồng đầu vào được sắp xếp trước như thế này, thì Kết hợp hợp nhất hầu như luôn nhanh hơn hai luồng còn lại (Nối vòng và Ghép).

Nhược điểm là những gì bạn đã nhận thấy:nó dường như đang quét toàn bộ chỉ mục trong đó, vì vậy làm thế nào mà có thể nhanh hơn nếu nó đang đọc quá nhiều bản ghi có thể không bao giờ được sử dụng? Câu trả lời là Quét (vì tính chất tuần tự của chúng) có thể đọc ở bất kỳ đâu từ 10 đến 100 lần số lượng bản ghi / giây khi tìm kiếm.

Bây giờ Tìm kiếm thường giành chiến thắng vì chúng có tính chọn lọc:chúng chỉ nhận được các hàng mà bạn yêu cầu, trong khi Quét là không chọn lọc:chúng phải trả về mọi hàng trong phạm vi. Nhưng bởi vì Quét có một nhiều tỷ lệ đọc cao hơn, chúng thường xuyên có thể đánh bại Tìm kiếm miễn là tỷ lệ của Hàng bị loại bỏ so với Hàng phù hợp là thấp hơn so với tỷ lệ hàng quét / giây VS. Tìm kiếm hàng / giây.

Bạn có câu hỏi?

Được rồi, tôi đã được yêu cầu giải thích thêm câu cuối cùng:

"Hàng bị loại bỏ" là hàng mà Quét đọc (vì nó phải đọc mọi thứ trong chỉ mục), nhưng điều đó sẽ bị từ chối bởi toán tử Kết hợp Hợp nhất, vì nó không có kết quả phù hợp ở phía bên kia, có thể vì Điều kiện mệnh đề WHERE đã loại trừ nó.

"Hàng phù hợp" là những hàng mà nó đọc được thực sự khớp với một thứ gì đó trong Kết hợp hợp nhất. Đây là những hàng tương tự mà Seek sẽ đọc nếu Scan được thay thế bằng Seek.

Bạn có thể tìm ra những gì có bằng cách xem thống kê trong Kế hoạch truy vấn. Bạn có thấy mũi tên to béo ở bên trái của Quét chỉ mục không? Điều đó thể hiện số hàng mà trình tối ưu hóa nghĩ rằng nó sẽ đọc với Quét. Hộp thống kê của Quét chỉ mục mà bạn đã đăng cho thấy Hàng thực được trả về là khoảng 5,4M (5,394.402). Điều này tương đương với:

TotalScanRows = (MatchingRows + DiscardedRows)

(Dù sao thì theo điều kiện của tôi). Để có được các Hàng phù hợp, hãy xem "Các hàng thực tế" được báo cáo bởi nhà điều hành Kết hợp Hợp nhất (bạn có thể phải vượt qua TOP 100 để có được điều này chính xác). Khi bạn biết điều này, bạn có thể lấy các hàng Đã loại bỏ bằng cách:

DiscardedRows = (TotalScanRows - MatchingRows)

Và bây giờ bạn có thể tính toán tỷ lệ.



  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 hàm Object_id () với #tables

  2. Tạo SQL Tạo tập lệnh cho các bảng hiện có với Truy vấn

  3. Cách tạo chuỗi trong SQL Server 2008

  4. tự động hóa truy vấn SQL để chạy hàng tháng

  5. Làm thế nào để kết hợp hai câu lệnh SQL này?