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

Ý nghĩa hiệu suất của việc sử dụng (DBMS_RLS) Oracle Row Level Security (RLS)?

Như với tất cả các câu hỏi liên quan đến hiệu suất, câu trả lời là, "nó phụ thuộc". RLS hoạt động bằng cách gói truy vấn được kiểm soát trong một truy vấn bên ngoài áp dụng chức năng chính sách dưới dạng mệnh đề WHERE ...

select /*+ rls query */ * from ( 
    select /*+ your query */ ... from t23 
    where whatever = 42 )
where rls_policy.function_t23 = 'true'

Vì vậy, các hàm ý về hiệu suất hoàn toàn phụ thuộc vào những gì diễn ra trong chức năng.

Cách thông thường để làm những việc này là sử dụng không gian tên ngữ cảnh. Đây là những vùng được xác định trước của bộ nhớ phiên được truy cập thông qua hàm SYS_CONTEXT (). Vì vậy, chi phí truy xuất giá trị được lưu trữ từ ngữ cảnh là không đáng kể. Và như chúng tôi thường điền các không gian tên một lần mỗi phiên - giả sử bằng trình kích hoạt sau khi đăng nhập hoặc một móc kết nối tương tự - chi phí tổng thể cho mỗi truy vấn là không đáng kể. Có nhiều cách khác nhau để làm mới không gian tên có thể có ý nghĩa về hiệu suất nhưng một lần nữa, những cách này là tầm thường trong tổng thể của mọi thứ ( xem câu trả lời khác này ).

Vì vậy, tác động đến hiệu suất phụ thuộc vào những gì chức năng của bạn thực sự làm. Điều này khiến chúng tôi xem xét chính sách thực tế của bạn:

Tin tốt là thực thi của một chức năng như vậy không có khả năng tốn kém. Tin xấu là hiệu suất vẫn có thể là Teh Suck! dù sao, nếu tỷ lệ của các bản ghi trực tiếp với các bản ghi lịch sử là bất lợi. Bạn có thể sẽ truy xuất tất cả các bản ghi và sau đó lọc ra các bản ghi lịch sử. Trình tối ưu hóa có thể đẩy vị từ RLS vào truy vấn chính nhưng tôi nghĩ điều đó khó xảy ra do cách hoạt động của RLS:nó tránh tiết lộ các tiêu chí của chính sách cho cái nhìn chung (điều này làm cho hoạt động gỡ lỗi RLS trở thành một PITN thực sự).

Người dùng của bạn sẽ phải trả giá cho quyết định thiết kế kém của bạn. Sẽ tốt hơn nhiều nếu có các bảng lịch sử hoặc tạp chí để lưu trữ các bản ghi cũ và chỉ giữ dữ liệu trực tiếp trong các bảng thực. Lưu giữ các bản ghi lịch sử cùng với các bản ghi trực tiếp hiếm khi là một giải pháp phù hợp.

DBMS_RLS yêu cầu giấy phép Phiên bản Doanh nghiệp.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Việc bao quanh tên cột trong các dấu quoatation kép bằng lệnh CREATE trong Oracle không hoạt động bình thường. Tại sao?

  2. Làm thế nào để Xuất nhập Cơ sở dữ liệu trong Oracle 11g (Application Express Edition)?

  3. Sự khác biệt giữa con trỏ rõ ràng và ẩn trong Oracle là gì?

  4. Cách thể hiện loại Blob có thể nối tiếp trong tệp ánh xạ ngủ đông

  5. Sử dụng câu lệnh IF phức tạp trong Oracle SQL