MINUS là một hoạt động tập hợp, cũng như lấy kết quả của truy vấn thứ hai khỏi truy vấn đầu tiên, cũng sẽ loại bỏ các bản sao nếu chúng xuất hiện trong tập hợp đầu tiên. từ TABLE_1 trước khi trả lại cho người dùng.
Nếu bạn có thể chắc chắn rằng không có bản sao cho đầu trimemd / ngày có hiệu lực trong tập hợp đầu tiên (hoặc bạn không muốn các bản sao như vậy bị xóa), bạn có thể thử
SELECT RTRIM(LTRIM(A.HEAD)), A.EFFECTIVE_DATE,
FROM TABLE_1 A
WHERE A.TYPE_OF_ACTION='6'
AND A.EFFECTIVE_DATE >= ADD_MONTHS(SYSDATE,-15)
AND NOT EXISTS
(select 1 from table_2 b
where RTRIM(LTRIM(b.head)) = RTRIM(LTRIM(a.head))
and b.effective_date = a.effective_date) )
Bằng cách đó, truy vấn có thể bắt đầu trả về kết quả nhanh hơn nhiều, đặc biệt nếu bảng_2 rất nhỏ hoặc các hàng có thể được truy cập thông qua một chỉ mục trên hiệu_thức hoặc đầu.
Tái bút. Nếu bạn có thể, hãy xóa các bit RTRIM (LTRIM ()).
PPS. Vẫn không có gì đảm bảo rằng nó sẽ trở lại sau 8 giây. Điều đó sẽ phụ thuộc vào mức độ lớn của table_1 và các chỉ mục trên type_of_action và / hoặc effect_date.
Đã thêm:
Bạn có thể trỏ qua
SELECT RTRIM(LTRIM(A.HEAD)), A.EFFECTIVE_DATE,
FROM TABLE_1 A
WHERE A.TYPE_OF_ACTION='6'
AND A.EFFECTIVE_DATE >= ADD_MONTHS(SYSDATE,-15)
và bỏ qua các hàng nếu nó trả về
select 1 from table_2 b
where RTRIM(LTRIM(b.head)) = :1
and b.effective_date = :1
and rownum =1
Nhưng chắc chắn sẽ mất nhiều thời gian hơn để thực thi hoàn toàn. Có thể các đơn hàng có cường độ dài hơn (tức là hàng giờ) tùy thuộc vào thời gian mỗi lần kiểm tra bảng_2 diễn ra trong bao lâu. Không chắc chắn chính xác tiêu chí nào được sử dụng cho phần cắt (thời lượng cuộc gọi hoặc thời lượng mở con trỏ SQL), vì vậy nó có thể đóng con trỏ bên ngoài. Và tùy thuộc vào kích thước / chỉ mục / nội dung của table_1, con trỏ bên ngoài vẫn có thể không trả về các hàng đầu tiên trong khung thời gian.
Có bao nhiêu hàng trong bảng_1, bảng_2 và những chỉ mục nào có sẵn?