Thứ Năm, 10 tháng 11, 2022

Tối ưu câu lệnh bằng RESULT CACHE trong Oracle Database

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

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


Để hiểu rõ hơn về cách thức hoạt động của Result Cache, ta xét 1 ví dụ đơn giản sau:
1. Thiết lập môi trường test:

Tạo bảng và insert dữ liệu mẫu

1
2
3
4
5
6
7
CREATE TABLE tbl_cache (id NUMBER);
INSERT INTO tbl_cache VALUES(1);
INSERT INTO tbl_cache VALUES(2);
INSERT INTO tbl_cache VALUES(3);
INSERT INTO tbl_cache VALUES(4);
INSERT INTO tbl_cache VALUES(5);
COMMIT;

Tạo 1 hàm xử lý dữ liệu trên bảng tbl_cache, và giả lập hàm này xử lý rất lâu.

1
2
3
4
5
6
7
CREATE OR REPLACE FUNCTION slow_function (p_id IN tbl_cache.id%TYPE)
    RETURN NUMBER
AS
BEGIN
    DBMS_LOCK.sleep (1);
    RETURN p_id; 
END;
* Lưu ý: user dùng để tạo hàm này phải được gán quyền thực thi câu lệnh DBMS_LOCK.sleep, nếu chưa được gán quyền ta sẽ thực hiện như sau:
  • Đăng nhập bằng quyền DBA.
    Ví dụ: sqlplus / as sysdba
  • Thực hiện gán quyền cho user
    Ví dụ: grant execute on sys.dbms_lock to orcl;

 2. Thực hiện test
SQL> set timing on;
SQL> SELECT slow_function(id) FROM tbl_cache;
SLOW_FUNCTION(ID)
-----------------
                1
                2
                3
                4
                5
Elapsed: 00:00:05.03
Ta thấy rằng câu lệnh trên thực thi mất hơn 5 giây :(
Sau đây ta sẽ áp dụng RESULT_CACHE vào trong câu lệnh trên:
SQL> SELECT /*+ result_cache */ slow_function (id) FROM tbl_cache;
SLOW_FUNCTION(ID)
-----------------
                1
                2
                3
                4
                5
Elapsed: 00:00:10.02
SQL> SELECT /*+ result_cache */ slow_function (id) FROM tbl_cache;
SLOW_FUNCTION(ID)
-----------------
                1
                2
                3
                4
                5
Elapsed: 00:00:00.00
Với câu lệnh ban đầu thì thời gian thực thi mất hơn 10 giây. :(( Câu thứ 2 thì không mất giây nào :))
Trong bài 1, bạn đã được lưu ý một số trường hợp câu lệnh không được CACHE (xem lại Bài 1). Ở đây câu 1 chạy lâu vì là chạy lần đầu.
Ta xét tiếp trường hợp CACHE bị flush (có thể là vùng nhớ RESULT_CACHE đã hết hoặc DBA thực hiện flush bằng tay)
SQL> exec dbms_result_cache.flush;
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.00
SQL> SELECT /*+ result_cache */ slow_function (id) FROM tbl_cache;
SLOW_FUNCTION(ID)
-----------------
                1
                2
                3
                4
                5
Elapsed: 00:00:10.03
SQL> SELECT /*+ result_cache */ slow_function (id) FROM tbl_cache;
SLOW_FUNCTION(ID)
-----------------
                1
                2
                3
                4
                5
Elapsed: 00:00:00.01

Khi vùng nhớ RESULT_CACHE bị flush (do nhiều nguyên nhân) thì đương nhiên kết quả của lần chạy trước sẽ không được lưu trong SGA và ở lần chạy tiếp theo thời gian truy vấn của bạn sẽ dài hơn.
=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile: 0902912888
⚡️ Skype: tranbinh48ca
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: http://bit.ly/ytb_binhoraclemaster
👨 Tiktok: https://www.tiktok.com/@binhoraclemaster?lang=vi
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhoracle
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,khóa học pl/sql, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, middleware, hoc solaris, hoc linux, hoc aix, unix, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master