Chỉnh sửa: +1 hoạt động trong tình huống này vì hóa ra đó FILE_NUMBER
là phiên bản chuỗi không đệm của một số nguyên. Một giải pháp tốt hơn ở đây cho các chuỗi là nối thêm ''
(chuỗi trống), vì việc nối thêm một giá trị có thể ảnh hưởng đến thứ tự hoặc cho các số để thêm một thứ không đổi nhưng chứa hàm không xác định, chẳng hạn như sign(rand()+1)
. Ý tưởng 'phá vỡ sự sắp xếp' vẫn còn hiệu lực ở đây, chỉ là phương pháp của tôi không lý tưởng.
+1
Không, tôi không có nghĩa là tôi đồng ý với bất cứ điều gì, tôi có nghĩa là đó là một giải pháp. Nếu bạn thay đổi truy vấn của bạn để ORDER BY cj.FILE_NUMBER + 1
sau đó TOP 1
sẽ hành xử khác nhau.
Bạn thấy, với mục tiêu hàng nhỏ thay thế cho một truy vấn có thứ tự, hệ thống sẽ cố gắng tiêu thụ dữ liệu theo thứ tự, để tránh có toán tử Sắp xếp. Nó cũng sẽ tránh xây dựng bảng băm, cho rằng có lẽ nó không phải làm quá nhiều việc để tìm hàng đầu tiên. Trong trường hợp của bạn, điều này là sai - từ độ dày của những mũi tên đó, có vẻ như nó phải tiêu thụ rất nhiều dữ liệu để tìm một kết quả khớp duy nhất.
Độ dày của các mũi tên đó cho thấy DOCUMENT_QUEUE
bảng (DQ) của bạn nhỏ hơn nhiều so với CORRESPONDENCE_JOURNAL
bảng (CJ) của bạn . Và kế hoạch tốt nhất thực sự sẽ là kiểm tra các hàng DQ cho đến khi tìm thấy một hàng CJ. Thật vậy, đó là những gì Trình tối ưu hóa truy vấn (QO) sẽ làm nếu nó không có vấn đề này ORDER BY
trong đó, được hỗ trợ độc đáo bởi một chỉ số bao trùm trên CJ.
Vì vậy, nếu bạn bỏ ORDER BY
hoàn toàn, tôi hy vọng bạn sẽ có được một kế hoạch liên quan đến Vòng lặp lồng nhau, lặp lại qua các hàng trong DQ, tìm kiếm vào CJ để đảm bảo hàng tồn tại. Và với TOP 1
, điều này sẽ dừng lại sau khi một hàng duy nhất đã được kéo.
Nhưng nếu bạn thực sự cần hàng đầu tiên theo FILE_NUMBER
thứ tự, thì bạn có thể lừa hệ thống bỏ qua chỉ số đó có vẻ (không chính xác) rất hữu ích, bằng cách thực hiện ORDER BY CJ.FILE_NUMBER+1
- mà chúng ta biết sẽ giữ trật tự như trước, nhưng quan trọng là QO không. QO sẽ tập trung vào việc hoàn thành toàn bộ, để có thể thỏa mãn toán tử Top N Sort. Phương pháp này sẽ tạo ra một kế hoạch có chứa toán tử vô hướng tính toán để tìm ra giá trị để đặt hàng và toán tử Top N Sort để có được hàng đầu tiên. Nhưng ở bên phải của những thứ này, bạn sẽ thấy một Nested Loop đẹp, thực hiện nhiều Tìm kiếm trên CJ. Và hiệu suất tốt hơn so với việc chạy qua một bảng lớn các hàng không khớp với bất cứ thứ gì trong DQ.
Hash Match không nhất thiết phải khủng khiếp, nhưng nếu tập hợp các hàng bạn trở về từ DQ nhỏ hơn so với CJ (như tôi mong đợi), thì Hash Match sẽ quét nhiều hơn về CJ hơn nó cần
Lưu ý: Tôi đã sử dụng +1 thay vì +0 vì trình tối ưu hóa truy vấn có khả năng nhận ra rằng +0 không thay đổi gì. Tất nhiên, điều tương tự có thể áp dụng cho +1, nếu không phải bây giờ, thì tại một thời điểm nào đó trong tương lai.
DOCUMENT_ID
mối quan hệ giữa hai bảng (hoặc mỗi bản ghi trong đóCORRESPONDENCE_JOURNAL
có bản ghi khớp nhauDOCUMENT_QUEUE
không)?