Có nhiều khả năng. Bạn có thể lọc ra số lượng lớn các hàng có ngày không hợp lệ/null trong pub_time, nhưng tôi nghi ngờ rằng bạn không thể chú ý/đề cập đến một số lượng đáng kể trong số này.
Ba điều mà dính ra trong tâm trí của tôi là:
- Bạn có một chỉ số hoặc chỉ số tổng hợp liên quan đến pub_time, và những hạn chế trong bạn mệnh đề where được kích hoạt việc sử dụng một con đường truy cập khác nhau
- Bạn không có sẵn số liệu thống kê cho trình tối ưu hóa khi bạn chạy truy vấn đầu tiên của mình. Khi chạy truy vấn thứ hai, một đường dẫn truy cập tốt hơn đã được chọn nhờ một số bộ đệm thông tin đã xảy ra khi bạn chạy truy vấn đầu tiên. Điều này có thể được xác minh bằng cách chạy truy vấn đầu tiên thêm vài lần nữa và xem liệu có cải thiện hiệu suất đáng kể hay không.
- Tương tự như điểm đầu tiên, trình tối ưu hóa chỉ có thể chọn đường dẫn truy cập tốt hơn chỉ dựa trên tác động của mệnh đề where. Có lẽ đưa ra gợi ý rằng các giá trị null/không hợp lệ sẽ không phải được xử lý là đủ - hệ thống của bạn có thể tránh một hoặc nhiều lần quét bảng đầy đủ để loại bỏ không hợp lệ/null pub_times.
Xác định lý do cho những điều như thế này nhanh chóng trở thành một liên doanh thực nghiệm - thật khó cho tôi để nói nhiều hơn mà không biết nền tảng của bạn & phiên bản. Từ thẻ tôi lấy nó bạn đang sử dụng oracle, trong trường hợp đó bạn sẽ có thể sử dụng một số hình thức "giải thích truy vấn" hoặc "giải thích kế hoạch" công cụ để có được một cảm giác tốt hơn về những gì đang xảy ra. Để biết thêm thông tin về trình tối ưu hóa oracle, hãy xem http://docs.oracle.com/cd/B10500_01/server.920/a96533/optimops.htm (Điều này là dành cho Oracle 9i v9.2, nhưng nó có một giải thích hợp lý về các khái niệm độc lập về phiên bản)
Có chỉ mục nào trên cột 'pub_time' không? – Ollie
Chỉ cần đoán nhưng t.pub_time có thể là NULL không? – markblandford
dường như mệnh đề where của bạn lọc ra rất nhiều hồ sơ, tại sao? 'null' giá trị, hoặc chỉ đơn giản là mục với giá trị thời gian bị lỗi trước 01.01.1900 – ntziolis