All about Oracle Technologies

Friday, 9 January 2015

Tối ưu câu lệnh bằng RESULT CACHE (Phần 1)

TỔNG QUAN VỀ RESULT CACHE

Phần 1: Giới thiệu về Result Cache
Với 1 yêu cầu phải SELECT 1 lượng dữ liệu lớn và được lặp đi lặp lại nhiều lần thì có cách nào để tái sử dụng kết quả của lần trước để tiết kiệm được thời gian không?
Câu trả lời là CÓ, bằng cách sử dụng RESULT CACHE. Oracle hỗ trợ cho chúng ta 2 chế độ:
  • Result Cache phía Server
  • Result Cache phía Client
Trong phạm vi bài viết này, người viết chỉ đề cập đến vấn đề Result Cache phía Server. Các vấn đề còn lại, người xem có thể tham khảo bài viết chi tiết tại link sau: docs.oracle.com/cd/E16655_01/server.121/e15857/tune_result_cache.htm#TGDBA616

Phần 2: Giới thiệu về Server Result Cache
1. Cơ chế hoạt động của Server Result Cache như sau: 

Nhìn vào hình trên ta thấy rằng khi có 1 yêu cầu SELECT dữ liệu được phát ra, sau khi được xử lý, kết quả này sẽ được chuyển vào vùng SGA, cụ thể là vùng RESULT CACHE. Với các câu SELECT tương tự, Oracle sẽ vào RESULT CACHE lấy kết quả và trả về cho người dùng chứ không thực hiện từ bước 1 cho đến bước 3 nữa. Kết quả CACHE này sẽ mất giá trị (Invalid) khi dữ liệu của câu lệnh SELECT tạo ra kết quả đó có sự thay đổi.
* Lưu ý: Kết quả sẽ không được CACHE lại do các nguyên nhân sau:
  • Câu lệnh truy vấn được chạy lần đầu tiên
  • CACHE được xóa tự động để dành vùng nhớ cho các thao tác khác, để cấu hình giới hạn này ta có thể tham khảo thêm cách cấu hình tham số RESULT_CACHE_MAX_RESULT
  • DBA thực hiện việc xóa vùng nhớ CACHE bằng câu lệnh: dbms_result_cache.flush

2. Sử dụng Result Cache ở mức SYSTEM / SESSION:
Để sử dụng Result Cache ở mức này trước khi thực hiện các câu lệnh ta thực hiện: ALTER SYSTEM / SESSION SET RESULT_CACHE_MODE=FORCE;
Sau đó ta thực hiện các câu truy vấn như bình thường.
Ví dụ:SELECT prod_id, SUM(amount_sold) FROM sales GROUP BY prod_id;
Khi sử dụng ở mức này thì tất cả các câu lệnh trên SYSTEM / SESSION sẽ được CACHE lại, do vậy đối với các câu lệnh không sử dụng các hàm tính toán (như SELECT * FROM ...) để tránh lãnh phí vùng nhớ RESULT CACHE trên SGA ta nên dùng Oracle Hint sau /*+ NO_RESULT_CACHE */
Ví dụ: SELECT /*+ NO_RESULT_CACHE */ FROM sales ORDER BY time_id DESC;

3. Sử dụng Server Result Cache ở mức bảng:
Để sử dụng Result Cache ở mức bảng, khi tạo bảng ta thêm từ khóa sau: RESULT_CACHE (MODE FORCE)
Ví dụ: CREATE TABLE sales (...) RESULT_CACHE (MODE FORCE);
Tương tự như sử dụng ở mức SYSTEM/SESSION, với các câu lệnh không sử dụng các hàm tính toán (như SELECT * FROM ...) để tránh lãnh phí vùng nhớ RESULT CACHE trên SGA ta nên dùng Oracle Hint sau /*+ NO_RESULT_CACHE */
Ví dụ: SELECT /*+ NO_RESULT_CACHE */ FROM sales ORDER BY time_id DESC;

4. Sử dụng Server Result Cache bằng cách dùng Oracle Hint:
Một cách đơn giản không cần cấu hình Result Cache ở mức bảng đó là dùng Oracle Hint khi thực hiện truy vấn dữ liệu.
Ví dụ: SELECT /*+ RESULT_CACHE */ prod_id, SUM(amount_sold) FROM sales GROUP BY prod_id;

Phần 3: Các giới hạn khi sử dụng RESULT CACHE
Dưới đây là 1 số giới hạn khi sử dụng RESULT CACHE:
  • Bảng tạm hoặc các bảng thuộc về schema SYS và SYSTEM
  • NEXTVAL và CURRVAL dùng trong Sequence
  • Các hàm sau: CURRENT_DATE, CURRENT_TIMESTAMP, LOCAL_TIMESTAMP, USERENV/SYS_CONTEXT (with non-constant variables), SYS_GUID, SYSDATE, and SYS_TIMESTAM

0 comments :

Post a Comment