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

so sánh hai con trỏ trong oracle thay vì sử dụng MINUS

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?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào tôi có thể tìm thấy hộp có kích thước phù hợp cho từng sản phẩm?

  2. Strugging với Spring SimpleJdbcCall để gọi hàm Oracle

  3. Làm thế nào để nâng cao một Ngoại lệ bên trong một Trigger? Có cách nào để làm việc này không?

  4. Cách sử dụng LISTAGG để trả về các hàng có tiền tố là dấu ngoặc kép

  5. Cách định dạng ngày từ Oracle thành ngày giờ hợp lệ trong c #