Tôi đang tham gia một bảng nhỏ (1.000 hàng) với một bảng lớn (8M hàng) trong SQL Server 2008. Liên kết sử dụng chỉ mục bao phủ không bao gồm trên bảng lớn và phép nối có thể tạo ra ba kế hoạch truy vấn có thể. Tôi đang cố gắng tìm ra kế hoạch nào tốt hơn, nhưng tôi cũng muốn khái quát hóa kiến thức này để lần sau tôi có thể biết rõ hơn phương pháp phỏng đoán sẽ sử dụng khi xem số liệu thống kê I / O của SQL.
Kế hoạch số 1 là tham gia vòng lặp và phát ra số liệu thống kê cho bảng lớn như thế này:
Scan count 2582, logical reads 35686, physical reads 1041, read-ahead reads 23052
Kế hoạch số 2 là một liên kết hợp nhất và phát ra số liệu thống kê như thế này:
Scan count 1, logical reads 59034, physical reads 49, read-ahead reads 59004
Kế hoạch số 3 là một phép nối băm và phát ra số liệu thống kê như thế này:
Scan count 3, logical reads 59011, physical reads 5, read-ahead reads 59010
Các chỉ số bao gồm được sắp xếp theo (ID, Date). Truy vấn trả về dữ liệu cho khoảng 50% ID và, đối với mỗi ID, trả về một đoạn liền kề của 3 tháng gần đây nhất của dữ liệu, thường là khoảng 1/4 hoặc các hàng cho mỗi ID. Truy vấn trả về khoảng 1/8 tổng số hàng trong chỉ mục. Nói cách khác, truy vấn rất thưa thớt nhưng nhất quán là như vậy.
Giả định của tôi là kế hoạch số 1 là khủng khiếp cho khối lượng công việc này, bởi vì việc di chuyển đầu đĩa khoảng 2.500 lần (hoặc thậm chí 1.041 lần) đắt hơn nhiều so với quét đĩa tuần tự. Tôi cũng giả định rằng # 3 và # 2 có các mẫu I / O tương tự, tuần tự (và do đó hiệu quả hơn).
Nhưng có trường hợp nào kế hoạch số 1 thực sự tốt nhất không, trong đó "tốt nhất" có nghĩa là ít ảnh hưởng đến hệ thống con I / O và ít ảnh hưởng đến các truy vấn khác chạy đồng thời?
Hoặc nó thực sự phụ thuộc vào nhiều biến như loại hệ thống con đĩa tôi có, phân mảnh chỉ mục, v.v ... Nếu "nó phụ thuộc" thì có bất kỳ quy tắc nào để tiếp cận vấn đề không?