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

Hiệu quả của việc tính toán số lượng nhân lực hàng quý

Có vẻ là một biến thể tốt trong trường hợp có chỉ mục trên ít nhất effective_start_dateeffective_end_date các trường của per_all_people_f bảng.

Biến thể lý tưởng cho truy vấn này là

create index x_per_all_people_search on per_all_people_f(   
  effective_start_date,
  effective_end_date, 
  person_id,  
  emp_flag
)

nhưng nó có thể quá đắt để duy trì (chi phí đĩa, tốc độ chèn).

Ngoài ra, con trỏ trong phần thân gói phải chứa truy vấn con và sử dụng lại kết quả cuộc gọi hàm:

cursor cur_var
is 
  select 
    EMP_2012,
    EMP_2013,
    (EMP_2013 - EMP_2012) Diff
  from (
   select 
     function_name('01-MAR-2012','31-MAY-2012') EMP_2012,
     function_name('01-MAR-2013','31-MAY-2013') EMP_2013
   from dual
  );

Tất nhiên giải pháp tốt nhất là giảm thiểu chuyển đổi ngữ cảnh và lấy tất cả các giá trị từ một truy vấn SQL. Ngoài ra, bạn có thể cung cấp các tham số trực tiếp cho con trỏ:

cursor cur_var(
  start_1 date, end_1 date, 
  start_2 date, end_2 date
)
is 
  select 
    EMP_2012,
    EMP_2013,
    (EMP_2013 - EMP_2012) Diff
  from (
   select 
     (
       select 
         count(distinct papf.person_id)
       from 
         per_all_people_f papf
       where 
         papf.emp_flag = 'Y'
         and 
         effective_start_date >= trunc(start_1)
         and 
         effective_end_date   <= trunc(end_1)
     ) EMP_2012,
     (
       select 
         count(distinct papf.person_id)
       from 
         per_all_people_f papf
       where 
         papf.emp_flag = 'Y'
         and 
         effective_start_date >= trunc(start_2)
         and 
         effective_end_date   <= trunc(end_2)
     ) EMP_2013
   from dual
  );

Theo quan điểm của tôi, các tham số hàm / con trỏ quá chung chung, tốt hơn nên tạo một trình bao bọc lấy tham số đầu vào là số quý và hai năm để so sánh.

Và cuối cùng, nếu kết quả được lên kế hoạch sử dụng trong PL / SQL (tôi cho rằng vì trả về một hàng duy nhất) hoàn toàn không sử dụng con trỏ, chỉ trả về các giá trị được tính toán thông qua các tham số đầu ra. Từ một quan điểm khác, nếu bạn cần lấy dữ liệu quý cho cả năm trong một con trỏ, có thể hiệu quả hơn khi đếm tất cả các quý và so sánh nó trong một truy vấn duy nhất.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Định dạng DATE mặc định của Oracle

  2. ODP.NET có yêu cầu cài đặt Oracle Client không

  3. Tạo chuỗi UUID không có REGEXP_REPLACE và PL / SQL

  4. Khắc phục sự cố với Oracle Trigger để tạo id từ một chuỗi

  5. CHÈN Đường dẫn Trực tiếp Oracle