Memory Tuning phân bổ hoặc phân bổ lại bộ nhớ trống cho các thành phần bộ nhớ Oracle. Nó chủ yếu dùng cho Performance Tuning trên Oracle Queries.
Ngày nay, vấn đề lớn của mọi Client liên quan đến Database Performance. Blog này giải thích cách Tuning Memory trong Database giúp đạt hiệu suất cao. Có nhiều phương pháp Memory Tuning: OS Level Process Tuning, CPU Tuning, RAM Tuning, Database Tuning, v.v. Bài viết tập trung vào Memory Tuning trong Database.
Database Memory Tuning:
Memory Tuning cho Database là việc Tuning System Global Area (SGA). Danh sách các thành phần chính liên quan đến SGA Tuning. Hãy xem chi tiết từng thành phần:
- Keep Pool
- Default Pool, Recycle Pool, Stream Pool
- DB Buffer Cache: Free Buffers, Modified Buffers, Pinned Buffers
- Shared Pool
Keep Pool:
Có những Package được dùng hàng ngày. Để tăng hiệu suất, bạn cần giữ các Package đó trong SGA. Với Procedure, bạn có thể giữ Package đó trong Keep Pool. Nếu không gian cấp cho SGA bị Shutdown, SGA phải reallocate vào RAM, lúc đó dù giữ Package trong Keep Pool, nó vẫn bị Flush. Lần sau khi Restart và chạy Package đó, Package sẽ ở trong Keep Pool cho đến khi Shutdown Database. Làm như vậy giảm I/O.
Với Hit Ratios, bạn có thể đảm bảo Parse Code Execution Plans không bị Flush khỏi Library Cache. Hit Ratio cho Library Cache nên > 85%.
Stream Pool dùng để tạo Buffer cho Data Pump. Hàng ngày, một số Table nhỏ được dùng để tăng hiệu suất. Tốt hơn là giữ những Table đó trong SGA (Keep Pool). Điều này tăng hiệu suất vì không lấy dữ liệu từ Disk mà từ Memory. Đối với Table lớn, ta có Recycle Pool.
Mặc định, khi Select những Table nhỏ (Small Tables) dưới dạng Blocks được Fetch vào Data Buffer Cache và giữ ở Default Pool. Default Pool bị Flush khi bạn Select Table khác. Nếu còn không gian trong Buffer thì ổn, nếu không, nó sẽ Flush Table trước để chừa chỗ cho Table mới. Để tăng hiệu suất, hãy giữ Small Tables trong Keep Pool thay vì Default Pool. Hit Ratio cho Data Buffer Cache nên > 95%. Nếu dưới 95% thì cần Resize Database Buffer Cache.
Phần quan trọng nhất trong Memory Tuning là Database Buffer Cache và Shared Pool, hữu ích để duy trì đủ dữ liệu trong Memory. Mọi người cần biết các Operation cơ bản trong Database Buffer Cache cho SGA Tuning. Cuối bài, tôi sẽ chia sẻ một số ví dụ SQL Query tính Hit Ratio để Tuning Memory.
Free Buffers
Dữ liệu Modified dùng Fetched Blocks và Copy vào Data Buffer Cache trước khi thay đổi Image (Data). Những Buffer này gọi là Free Buffers. Từ hình dưới, Disk giá trị 1000 hoặc Memory giá trị 1000 là như nhau. Hình dưới minh họa Free Buffer:
Modified Buffers
Modified Buffers còn gọi là Dirty Buffers. Image trên Disk và Image trong Data Buffer Cache của Data đã thay đổi, nhưng Buffer/Data này chưa được ghi xuống Disk. Những Buffer này gọi là Dirty Buffers.
Hình sau minh họa Modified Buffer:
Pinned Buffers
Dữ liệu trong DB Buffer Cache thay đổi liên tục. Server Process sẽ Select Modified Data này cho các Transaction tiếp theo. Dữ liệu được chọn này chính là Pinned Data/Buffer.
Physical Reads: Oracle Data Blocks mà Oracle đọc từ Disk bằng cách thực hiện I/O.
Logical Reads: Nếu Oracle thỏa mãn Request bằng cách đọc dữ liệu từ Database Buffer Cache thì thuộc Logical Reads.
DB Block Gets: Khi Oracle tìm thấy dữ liệu cần thiết trong Database Buffer Cache, Oracle kiểm tra dữ liệu đã Commit hay chưa, nếu Committed thì Fetch từ Buffers. Những Buffer này cũng gọi là DB Buffer Gets.
Consistent Reads: Trong Database Buffer Cache, các Block hiện diện, Modified nhưng chưa Committed. Do đó, dữ liệu phải lấy từ Undo Datafile.
Mục tiêu của DB_BUFFER_CACHE là tăng Logical Reads.
Soft Parsing: Nếu đã có Execution Plan trong Library Cache, nó không đi đến Disk, sẽ tạo Parse Plan (Parse Code) từ Execution Plan hiện có. Đây gọi là Soft Parse.
Hard Parsing: Để tạo Parse Code, nó kiểm tra Execution Plan có sẵn không, nếu có thì Soft Parse. Nếu không có Execution Plan, nó thực hiện Hard Parse nghĩa là đi đến Disk.
Shared Pool: Shared Pool là sự kết hợp của Library Cache và Data Dictionary Cache.
Library Cache: Mục tiêu của Library Cache là tăng Soft Parsing.
Phương pháp đạt mục tiêu:
- Sử dụng Bind Variables
- Viết Stored Procedures
- Hit Ratio (Nên > 85%, nếu không tăng Shared Pool Size)
- DBMS_SHARED_POOL (Package) – Hit Ratio đóng vai trò chính trong Tuning Memory dùng SQL Queries.
Data Dictionary Cache: Còn gọi là Row Cache. Data Dictionary Cache Hit Ratio phải > 85%, nếu không tăng Shared Pool Size.
Các truy vấn mẫu tính Hit Ratio:
SELECT (SUM(PINHITS)/SUM(PINS))*100 AS LCHITRATIO FROM V$LIBRARYCACHE;
SELECT NAMESPACE, PINS, PINHITS, RELOADS FROM V$LIBRARYCACHE ORDER BY NAMESPACE;
Để lấy Package DBMS_SHARED_POOL, chạy @$ORACLE_HOME/RDBMS/ADMIN/DBMSPOOL.SQL
SELECT NAMESPACE, KEPT, LOCKS, EXECUTIONS FROM V$DB_OBJECT_CACHE WHERE TYPE LIKE '%PROC%';
Data Dictionary Cache Hit Ratio:
SELECT (SUM(GETS-GETMISSES_FIXED))/SUM(GETS) AS "DDCHITRATIO" FROM V$ROWCACHE;
Redo Log Buffer Cache:
SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME LIKE 'REDO%';
Hy vọng các điểm thảo luận hữu ích và bạn có thể dễ dàng Tuning Memory trong Database.
Sử dụng tab Feedback để bình luận hoặc đặt câu hỏi. Bạn cũng có thể bắt đầu cuộc trò chuyện với chúng tôi.