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

Trình tải SQL, độ bão hòa của trình kích hoạt?

Bạn đã đi đến nửa chặng đường của giải pháp:

Đây không phải là một bất ngờ. Việc triển khai hiện tại của bạn thực thi rất nhiều câu lệnh SELECT hàng đơn cho mỗi hàng bạn chèn vào bảng B. Điều đó chắc chắn sẽ cung cấp cho bạn một hồ sơ hiệu suất kém. SQL là một ngôn ngữ dựa trên tập hợp và hoạt động tốt hơn với các hoạt động nhiều hàng.

Vì vậy, việc bạn cần làm là tìm cách thay thế tất cả các câu lệnh SELECT bằng các câu lệnh thay thế hiệu quả hơn. Sau đó, bạn sẽ có thể loại bỏ vĩnh viễn các trình kích hoạt. Ví dụ:thay thế các tra cứu trên từ điển bằng các khóa ngoại giữa các cột của bảng A và bảng tham chiếu. Các ràng buộc toàn vẹn quan hệ, là mã nội bộ của Oracle, hoạt động tốt hơn nhiều so với bất kỳ mã nào chúng ta có thể viết (và cũng hoạt động trong môi trường nhiều người dùng).

Quy tắc về việc không chèn vào bảng A nếu một tổ hợp các cột đã tồn tại trong bảng B là một vấn đề khó khăn hơn. Không phải vì nó khó thực hiện mà vì nó có vẻ như thiết kế quan hệ kém. Nếu bạn không muốn tải các bản ghi trong bảng A khi chúng đã thoát khỏi bảng B, tại sao bạn không tải trực tiếp vào bảng B? Hoặc có lẽ bạn có một tập hợp con các cột sẽ được trích xuất từ ​​bảng A bảng B và được tạo thành bảng C (sẽ có mối quan hệ khóa ngoại với A và B)?

Dù sao, để điều đó sang một bên, bạn có thể làm điều này với SQL dựa trên bộ bằng cách thay thế SQL * Loader bằng một bảng bên ngoài. Một bảng bên ngoài cho phép chúng tôi trình bày tệp CSV vào cơ sở dữ liệu như thể nó là một bảng thông thường. Điều này có nghĩa là chúng ta có thể sử dụng nó trong các câu lệnh SQL bình thường. Tìm hiểu thêm.

Vì vậy, với các ràng buộc khóa ngoại trên từ điển và bảng bên ngoài, bạn có thể thay thế mã Trình tải SQL bằng câu lệnh này (tuân theo bất kỳ quy tắc nào khác được gộp chung thành "... và v.v."):

insert into table_a
select ext.* 
from external_table ext
     left outer join table_b b
     on (ext.name = b.name and ext.last_name = b.last_name and ext.dept=b.dept)
where b.name is null
log errors into err_table_a ('load_fail') ;

Điều này sử dụng cú pháp ghi lỗi DML để nắm bắt các lỗi ràng buộc cho tất cả các hàng theo kiểu dựa trên tập hợp. Tìm hiểu thêm . Nó sẽ không tăng ngoại lệ cho các hàng đã tồn tại trong bảng B. Bạn có thể sử dụng nhiều bảng CHÈN TẤT CẢ để định tuyến các hàng vào một bảng bổ sung hoặc sử dụng thao tác đặt MINUS sau sự kiện để tìm các hàng trong bảng bên ngoài không có trong bảng A. Tùy thuộc vào mục tiêu cuối cùng của bạn và cách bạn cần báo cáo mọi thứ.

Có lẽ một câu trả lời phức tạp hơn bạn mong đợi. Oracle SQL là một triển khai SQL rất rộng rãi, với rất nhiều chức năng để cải thiện hiệu quả của các hoạt động hàng loạt. Chúng tôi thực sự trả tiền để đọc Hướng dẫn khái niệm và Tham chiếu SQL để tìm hiểu xem chúng tôi có thể làm được bao nhiêu với Oracle.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng FLASHBACK trong Oracle

  2. Oracle PL / SQL:cách lấy dấu vết ngăn xếp, tên gói và tên thủ tục

  3. Oracle SQL Group Bởi nếu

  4. ORA-00904::mã định danh không hợp lệ Oracle sql

  5. Cách làm cho MERGE có thể nối tiếp hóa