1. การปรั บปรุ งประสิทธิภาพฐานข้ อมูล Oracle 11g
เกริ่นนา
เนื่องจากผู้ใช้ ฐานข้ อมูล Oracle มีมากขึ ้นทุกๆ วัน การที่เราได้ เรี ยนรู้การปรับแต่งประสิทธิภาพ จะช่วยให้ เรา
เข้ าใจและได้ ไอเดียใหม่ๆ เพื่อนามาปรับปรุงงานให้ มีประสิทธิภาพมากขึ ้น เนื ้อหาบทความนี ้ผมขอใช้ ฐานข้ อมูล Oracle
11g เป็ นตัวนาเสนอ เนื ้อหาของบทความเป็ นการเสนอแนะเท่านัน ไม่ได้ พดถึงทังหมดของการปรับปรุ งประสิทธิภาพ
้ ู ้
ฐานข้ อมูล
วัตถุประสงค์ของบทความ เพื่อให้ เป็ นประโยชน์แก่ผ้ สนใจและผู้ใช้ ฐานข้ อมูล Oracle
ู
1 การเพิ่มประสิทธิภาพ Instance Memory
1.1 การใช้ Automatic Memory Management
บนฐานข้ อมูล Oracle 11g เราจะรู้จก Automatic Memory Management ซึงฐานข้ อมุลจะจัดการปรับปรุง
ั ่
instance memory เองโดยอัตโนมัติ การจัดการหน่วยความจาอัตโนมัตินี ้จะขึ ้นกับขนาดของพารามิเตอร์
MEMORY_TARGET และ MEMORY_MAX_TARGET โดยที่ฐานข้ อมูลจะปรับปรุ งหน่วยความจาระหว่าง System
Global Area (SGA) และ Program Global Area (PGA)
SQL> show parameter memory_max_target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
memory_max_target big integer 0
SQL> show parameter memory_target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
memory_target big integer 0
วิธีการใช้ งาน Automatic Memory Management เราสามารถทาได้ โดย login ด้ วยสิทธ์ SYSDBA จากนัน
้
เปลียนแปลงค่า (สมมุติวาใช้ SPFILE):
่ ่
SQL> alter system set memory_max_target=1G scope=spfile;
System altered.
SQL> alter system set memory_target=1G scope=spfile;
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 1071333376 bytes
Fixed Size 1348968 bytes
Variable Size 729811608 bytes
Database Buffers 335544320 bytes
2. Redo Buffers 4628480 bytes
Database mounted.
Database opened.
SQL> show parameter memory_target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
memory_target big integer 1G
SQL> show parameter memory_max_target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
memory_max_target big integer 1G
จะเห็นว่าต้ อง stop/start Instance เพราะว่าพารามิเตอร์ MEMORY_MAX_TARGET ไม่ได้ เป็ น Dynamic
พารามิเตอร์ แต่สาหรับพารามิเตอร์ MEMORY_TARGET เราสามารถเปลียนได้ หลังจาก Instance start แต่ต้องไม่
่
มากกว่าค่าของ MEMORY_MAX_TARGET
SQL> alter system set memory_target=900M scope=both;
System altered.
SQL> show parameter memory_target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
memory_target big integer 900M
รูปภาพ 1-01 แสดงความสัมพันธ์ของพารามิเตอร์ ที่เกี่ยวกับหน่วยความจา (ที่มา @oracle)
หมายเหตุ ความสัมพันธ์ของพารามิเตอร์ ของหน่วยความจา
ถ้ า MEMORY_TARGET != 0
6. SQL> SELECT NAME, BLOCK_SIZE, SUM(BUFFERS) FROM V$BUFFER_POOL GROUP BY NAME,
BLOCK_SIZE HAVING SUM(BUFFERS) >0 ;
NAME BLOCK_SIZE SUM(BUFFERS)
-------------------- ---------- ------------
DEFAULT 8192 34720
SQL> alter system set db_keep_cache_size=100M;
System altered.
SQL> alter system set db_recycle_cache_size=50M;
System altered.
SQL> SELECT NAME, BLOCK_SIZE, SUM(BUFFERS) FROM V$BUFFER_POOL GROUP BY NAME,
BLOCK_SIZE HAVING SUM(BUFFERS) >0 ;
NAME BLOCK_SIZE SUM(BUFFERS)
-------------------- ---------- ------------
DEFAULT 8192 9920
KEEP 8192 12400
RECYCLE 8192 6448
SQL> alter table hr.employees storage (buffer_pool keep);
Table altered.
อย่างไรก็ตามเราสามารถใช้ SQL ต่อไปนี ้ในการหาจานวนของ BLOCK ของแต่ละ SEGMENT ที่อยูใน Buffer Pool
่
ปั จจุบน
ั
SQL> select o.object_name, count(*) number_of_blocks from dba_objects o, v$bh v where
o.data_object_id = v.objd and o.owner !='SYS' group by o.object_name order by count(*);
หมายเหตุ การใช้ KEEP Pool บน 11g นัน KEEP Pool จะไม่ถกใช้ งานถ้ าขนาด object ใหญ่กว่า 10% ของ
้ ู
db_keep_cache_size อย่างไรก็ตาม bug นี ้ถูกแก้ ไขที่ 11.2.0.2
บน 11g หาก object มีขนาดใหญ่มากกว่า db_keep_cache_size Oracle จะใช้ “direct path read” ดังนัน จึงเป็ น
้
เรื่ องสาคัญในการใช้ KEEP Pool ที่ต้องพิจารณาขนาดของข้ อมูล และขนาดของ KEEP Pool รวมไปถึง ความสมาเสมอ
่
ในการใช้ ข้อมูล
SQL อื่นๆ ที่ใช้ ในการหา object ใน Buffer Pool
SQL> select decode(pd.bp_id,1,'KEEP',2,'RECYCLE',3,'DEFAULT',
4,'2K SUBCACHE',5,'4K SUBCACHE',6,'8K SUBCACHE',
7,'16K SUBCACHE',8,'32KSUBCACHE','UNKNOWN') subcache,
bh.object_name,bh.blocks
from x$kcbwds ds,x$kcbwbpd pd,(select /*+ use_hash(x) */ set_ds,
o.name object_name,count(*) BLOCKS
from obj$ o, x$bh x where o.dataobj# = x.obj
and x.state !=0 and o.owner# !=0
group by set_ds,o.name) bh
where ds.set_id >= pd.bp_lo_sid
and ds.set_id <= pd.bp_hi_sid
and pd.bp_size != 0
and ds.addr=bh.set_ds
7. /
1.4 การใช้ Server Result Cache
Server Result Cache เป็ นหน่วยความจาที่อยูใน Shared Pool ซึงจะเก็บ SQL query result cache
่ ่
(ผลลัพธ์ จาก SQL) และ PL/SQL function result cache (ค่าที่ได้ จาก PL/SQL function)
พารามิเตอร์ ที่ใช้ ควบคุม server result cache
RESULT_CACHE_MAX_SIZE ใช้ ในการกาหนดค่าหน่วยความจาของ server result cache และ server
result cache จะถูกใช้ งานเมื่อพารามิเตอร์ นี ้มากกว่าศูนย์ และจะถูกปิ ดเมื่อค่าเป็ นศูนย์
RESULT_CACHE_MAX_RESULT กาหนดค่าทีมากที่สดของหน่วยความจาของ server result cache ที่ใช้
ุ
ในผลลัพธ์ของแต่ละครัง ค่าเริ่ มต้ นคือ 5% แต่สามารถระบุได้ ระหว่าง 1 – 100
้
RESULT_CACHE_REMOTE_EXPIRATION ใช้ ในการระบุระยะเวลาหมดอายุของผลลัพธ์ ใน server result
cache ค่าเริ่ มต้ นคือ 0 นาที
RESULT_CACHE_MODE ใช้ ในการพิจารณาในการใช้ result cache (MANUAL/FORCE)
ค่าของ RESULT_CACHE_MODE เริ่ มต้ นจะเป็ น MANUAL ดังนันกับ table ทัวไป เราจาเป็ นต้ องใช้ Hint
้ ่
SQL> show parameter result_cache_mode
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
result_cache_mode string MANUAL
SQL> show parameter result_cache_max_result
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
result_cache_max_result integer 5
SQL> show parameter result_cache_max_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
result_cache_max_size big integer 0
SQL> SELECT /*+ RESULT_CACHE */ department_id, AVG(salary) FROM hr.employees GROUP
BY department_id;
Execution Plan
----------------------------------------------------------
Plan hash value: 1192169904
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 11 | 77 | 4 (25)| 00:00:01 |
| 1 | HASH GROUP BY | | 11 | 77 | 4 (25)| 00:00:01 |
| 2 | TABLE ACCESS FULL| EMPLOYEES | 107 | 749 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------------
กรณีนี ้ result cache ยังถูกปิ ด (result_cache_max_size=0) ดังนันเราจาเป็ นต้ องเปิ ดการใช้ งาน result cache ก่อน
้
หลังจากเปลียนพารามิเตอร์ result_cache_max_size ให้ มากกว่าศูนย์
่
8. SQL> show parameter result_cache_max_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
result_cache_max_size big integer 50M
SQL> SELECT /*+ RESULT_CACHE */ department_id, AVG(salary) FROM hr.employees GROUP
BY department_id;
Execution Plan
----------------------------------------------------------
Plan hash value: 1192169904
--------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 11 | 77 | 4 (25)| 00:00:01 |
| 1 | RESULT CACHE | ccphn1vt8g8dk2wadcy16drzn3 | | | | |
| 2 | HASH GROUP BY | | 11 | 77 | 4 (25)| 00:00:01 |
| 3 | TABLE ACCESS FULL| EMPLOYEES | 107 | 749 | 3 (0)| 00:00:01 |
จะพบว่ามีการใช้ result cache อย่างไรก็ตามเราสามารถตรวจสอบสถานะของ result cache ได้ ด้วยฟั งก์ชน
ั
DBMS_RESULT_CACHE.STATUS
SQL> SELECT dbms_result_cache.status() FROM dual;
DBMS_RESULT_CACHE.STATUS()
--------------
ENABLED
จากตัวอย่างข้ างบน หากไม่ต้องการใช้ Hint (RESULT_CACHE) เราสามารถเปลียนค่า RESULT_CACHE_MODE เป็ น
่
FORCE ด้ วย ALTER SESSION
SQL> SELECT department_id, AVG(salary) FROM hr.employees GROUP BY department_id;
Execution Plan
----------------------------------------------------------
Plan hash value: 1192169904
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 11 | 77 | 4 (25)| 00:00:01 |
| 1 | HASH GROUP BY | | 11 | 77 | 4 (25)| 00:00:01 |
| 2 | TABLE ACCESS FULL| EMPLOYEES | 107 | 749 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------------
SQL> alter session set RESULT_CACHE_MODE=FORCE;
Session altered.
SQL> SELECT department_id, AVG(salary) FROM hr.employees GROUP BY department_id;
Execution Plan
----------------------------------------------------------
Plan hash value: 1192169904
--------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 11 | 77 | 4 (25)| 00:00:01 |
9. | 1 | RESULT CACHE | ccphn1vt8g8dk2wadcy16drzn3 | | | | |
| 2 | HASH GROUP BY | | 11 | 77 | 4 (25)| 00:00:01 |
| 3 | TABLE ACCESS FULL| EMPLOYEES | 107 | 749 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------
อย่างไรก็ตาม เราสามารถทีจะเปลียน result cache mode ที่ TABLE ได้ ALTER TABLE … RESULT_CACHE
่ ่
(MODE DEFAULT|FORCE)
SQL> select result_cache from all_tables where table_name='EMPLOYEES' and owner='HR';
RESULT_
-------
DEFAULT
SQL> alter table hr.employees result_cache (mode force);
Table altered.
SQL> select result_cache from all_tables where table_name='EMPLOYEES' and owner='HR';
RESULT_
-------
FORCE
หมายเหตุ พารามิเตอร์ RESULT_CACHE_MAX_SIZE กาหนดค่าหน่วยความจาสาหรับ result cache ถ้ าเป็ นศูนย์
result cache จะถูกปิ ด อย่างไรก็ตามค่าของหน่วยความจา result cache ยังผูกกับ SGA และการจัดการของ
หน่วยความจา -> 0.25% ของ MEMORY_TARGET หรื อ 0.5% ของ SGA_TARGET หรื อ 1% ของ
SHARED_POOL_SIZE
เมื่อเราใช้ งาน server result cache เราสามารถจะเช็คดูการจัดสรรหน่วยความจาได้ ด้วย
DBMS_RESULT_CACHE.MEMORY_REPORT procedure
SQL> execute dbms_result_cache.memory_report
Result Cache Memory Report
[Parameters]
Block Size = 1K bytes
Maximum Cache Size = 50M bytes (50K blocks)
Maximum Result Size = 2560K bytes (2560 blocks)
[Memory]
Total Memory = 103532 bytes [0.030% of the Shared Pool]
... Fixed Memory = 5180 bytes [0.001% of the Shared Pool]
... Dynamic Memory = 98352 bytes [0.028% of the Shared Pool]
....... Overhead = 65584 bytes
....... Cache Memory = 32K bytes (32 blocks)
........... Unused Memory = 28 blocks
........... Used Memory = 4 blocks
............... Dependencies = 1 blocks (1 count)
............... Results = 3 blocks
................... SQL = 1 blocks (1 count)
................... Invalid = 2 blocks (2 count)
และลบผลลัพธ์ออกจากหน่วยความจาได้ ด้วย DBMS_RESULT_CACHE.FLUSH
10. SQL> execute dbms_result_cache.flush
PL/SQL procedure successfully completed.
Result Cache Memory Report
[Parameters]
Block Size = 1K bytes
Maximum Cache Size = 50M bytes (50K blocks)
Maximum Result Size = 2560K bytes (2560 blocks)
[Memory]
Total Memory = 5180 bytes [0.001% of the Shared Pool]
... Fixed Memory = 5180 bytes [0.001% of the Shared Pool]
... Dynamic Memory = 0 bytes [0.000% of the Shared Pool]
หากเราต้ องการตรวจสอบสถิติของลัพธ์ที่อยูในหน่วยความจา
่
--------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 11 | 77 | 4 (25)| 00:00:01 |
| 1 | RESULT CACHE | ccphn1vt8g8dk2wadcy16drzn3 | | | | |
| 2 | HASH GROUP BY | | 11 | 77 | 4 (25)| 00:00:01 |
| 3 | TABLE ACCESS FULL| EMPLOYEES | 107 | 749 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------
SQL> SELECT ID, TYPE, CREATION_TIMESTAMP, BLOCK_COUNT, COLUMN_COUNT,
PIN_COUNT, ROW_COUNT FROM V$RESULT_CACHE_OBJECTS WHERE CACHE_ID =
'ccphn1vt8g8dk2wadcy16drzn3';
ID TYPE CREATION_ BLOCK_COUNT COLUMN_COUNT PIN_COUNT ROW_COUNT
---------- ---------- --------- ----------- ------------ ---------- ----------
1 Result 07-APR-11 1 2 0 12
หรื อต้ องการสังเกตุการณ์สถิติของ server result cache
SQL> SELECT NAME, VALUE FROM V$RESULT_CACHE_STATISTICS;
NAME VALUE
------------------------------ ---------------------------------------------------------------------------------
Block Size (Bytes) 1024
Block Count Maximum 51200
Block Count Current 32
Result Size Maximum (Blocks) 2560
Create Count Success 2
Create Count Failure 0
Find Count 8
Invalidation Count 1
Delete Count Invalid 0
Delete Count Valid 0
Hash Chain Length 1
Find Copy Count 8
11. หมายเหตุ เราสามารถใช้ NO_RESULT_CACHE hint ในกรณีที่ไม่ต้องการให้ Query ใช้ ผลลัพธ์ที่อยูในหน่วยความจา
่
1.5 การใช้ Client Result Cache
Oracle Call Interface (OCI) client result cache เป็ นหน่วยความจาที่อยูใน client process ซึงจะเก็บ
่ ่
ผลลัพธ์จาก SQL query สาหรับแอพลิเคชัน OCI การเก็บในหน่วยความจาจะเก็บในแต่ละ Process
หมายเหตุ เมื่อเปิ ดการใช้ งาน Client result cache ผลลัพธ์จากการ query นัน สามารถอยูในหน่วยความจาของ
้ ่
client, server หรื อทัง client และ server เราสามารถเปิ ดการใช้ งาน client result cache ได้ แม้ วา server result
้ ่
cache ถูกปิ ดการใช้ งานอยู่
สิงที่ได้ จากการใช้ งาน client result cache นันจะช่วยลดเวลาในการ query และการใช้ หน่วยความจา เมื่อต้ องการเปิ ด
่ ้
การใช้ client result cache ต้ องมีการพารามิเตอร์
CLIENT_RESULT_CACHE_SIZE เซตค่าขนาดสูงสุดของ client result cache สาหรับแต่ะ client process
การเปิ ดการใช้ งาน client result cache โดยการเซตค่า 32768 bytes หรื อมากกว่า
CLIENT_RESULT_CACHE_LAG ระบุระยะเวลาสูงสุดของ client result cache ที่จะลดลงหลังการ
เปลียนแปลง โดยค่าเริ่ มต้ นของพารามิเตอร์ 3000 (3 วินาที)
่
COMPATIBLE สาหรับการเปิ ดใช้ งาน client result cache ต้ องมีการเซตค่าเป็ น 11.0.0.0 หรื อ สูงกว่า
สาหรับ client cache บน view ต้ องเซต 11.2.0.0.0 หรื อ สูงกว่า
หมายเหตุ เราสามารถใช้ CLIENT_RESULT_CACHE_STATS$ view เพื่อตรวจสอบสถิตการใช้ งานหน่วยความจา
ิ
สาหรับ client result cache ของ client process ที่ยงใช้ งานฐานข้ อมูลอยู่
ั
จากนันลองทดสอบสาหรับ client result cache โดยให้ Session A ใช้ สาหรับกาหนดค่าพารามิเตอร์
้
client_result_cache_size และตรวจสอบ
Session A:
SQL> show parameter client_result_cache_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
client_result_cache_size big integer 0
SQL> select * from CLIENT_RESULT_CACHE_STATS$;
no rows selected
SQL> alter system set client_result_cache_size=32768 scope=spfile;
System altered.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
12. ORACLE instance started.
Total System Global Area 1071333376 bytes
Fixed Size 1348968 bytes
Variable Size 742394520 bytes
Database Buffers 322961408 bytes
Redo Buffers 4628480 bytes
Database mounted.
Database opened.
SQL> show parameter client_result_cache_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
client_result_cache_size big integer 32K
SQL> select * from CLIENT_RESULT_CACHE_STATS$;
CACHE_ID STAT_ID NAME VALUE
---------- ---------- -------------------- ----------
2 1 Block Size 0
2 2 Block Count Max 0
2 3 Block Count Current 0
2 4 Hash Bucket Count 0
2 5 Create Count Success 0
2 6 Create Count Failure 0
2 7 Find Count 0
2 8 Invalidation Count 0
2 9 Delete Count Invalid 0
2 10 Delete Count Valid 0
หลังจากนันใช้ Session B เพื่อเข้ าใช้ งาน result cache
้
Session B
$ sqlplus demo@orcl
SQL> SELECT /*+ RESULT_CACHE */ department_id, AVG(salary) FROM hr.employees GROUP BY
department_id;
DEPARTMENT_ID AVG(SALARY)
------------- -----------
100 8601.33333
30 4150
7000
20 9500
70 10000
90 19333.3333
110 10154
50 3475.55556
40 6500
80 8955.88235
10 4400
60 5760
จากนันกลับไปที่ Session A
้
13. Session A:
SQL> select * from CLIENT_RESULT_CACHE_STATS$;
CACHE_ID STAT_ID NAME VALUE
---------- ---------- -------------------- ----------
2 1 Block Size 256
2 2 Block Count Max 128
2 3 Block Count Current 128
2 4 Hash Bucket Count 1024
2 5 Create Count Success 0
2 6 Create Count Failure 0
2 7 Find Count 0
2 8 Invalidation Count 0
2 9 Delete Count Invalid 0
2 10 Delete Count Valid 0
จะพบว่ามีการใช้ งาน client result cache ของ session ที่ยงทางานอยูจากสถิต
ั ่
อย่างไรก็ตาม บน Client เราสามารถกาหนดค่าสาหรับ client ที่ sqlnet.ora ไฟล์ ซึงจะเป็ นทางเลือก และค่าที่กาหนด
่
นันจะถูกใช้ แทนที่คาใน init.ora ไฟล์บน server
้ ่
OCI_RESULT_CACHE_MAX_SIZE (optional) ขนาดสูงสุด (bytes) สาหรับเก็บ query ต่อ process ถ้ า
ค่าที่กาหนดน้ อยกว่า 32768 ใน sqlnet.ora ไฟล์ จะส่งผลให้ ปิดการใช้ งาน client result cache ฟี เจอร์
สาหรับ client process ที่ใช้ sqlnet.ora ไฟล์
OCI_RESULT_CACHE_MAX_RSET_SIZE (optional) ค่าขนาดสูงสุดของผลลัพธ์ (bytes)ใน process
OCI_RESULT_CACHE_MAX_RSET_ROWS (optional) ค่าขนาดสูงสุดของผลลัพธ์ (rows)ใน process
หมายเหตุ การใช้ PL/SQL Function Result Cache ช่วยให้ เราประหยัดพื ้นที่และเวลา ซึงเหมาะสมกับฟั งก์ชนที่ถก
่ ั ู
เรี ยกใช้ งานบ่อยๆ และประสิทธิภาพที่ได้ จะขึ ้นอยูข้อมูลว่าเปลียนแปลงบ่อยหรื อไม่
่ ่
สามารถอ่านเพิมเติมได้ ที่ Oracle Support [ID 430887.1]
่
ตัวอย่ าง
CREATE OR REPLACE package department_pks is
TYPE dept_info_record IS RECORD (average_salary number, number_of_employees number);
function get_dept_info(dept_id number) return dept_info_record RESULT_CACHE;
END department_pks ;
/
CREATE OR REPLACE PACKAGE BODY department_pks
AS
FUNCTION get_dept_info (dept_id number)
RETURN dept_info_record
RESULT_CACHE RELIES_ON (EMPLOYEES)
IS
result dept_info_record;
BEGIN
SELECT AVG(SALARY), count(*) INTO result FROM hr.employees WHERE
department_id = dept_id;
RETURN result;
END get_dept_info;
17. SQL> show parameter LOG_BUFFER
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_buffer integer 4096000
SQL> alter system set LOG_BUFFER=5120000 scope=spfile;
System altered.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 1071333376 bytes
Fixed Size 1348968 bytes
Variable Size 742394520 bytes
Database Buffers 318767104 bytes
Redo Buffers 8822784 bytes
Database mounted.
Database opened.
SQL> show parameter LOG_BUFFER
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_buffer integer 5120000
1.8 การตรวจสอบ PGA
หน่วยความจา PGA บรรจุข้อมูลและข้ อมูลการควบคุม server process มันเป็ นหน่วยความจาที่ไม่ต้องแชร์ ซง ึ่
ถูกสร้ างด้ วยฐานข้ อมูล Oracle เมื่อ server process เริ่ มต้ น และจะถูกจัดสรรกับการทางานเช่น การ sort ข้ อมูล
(ORDER BY, GROUP BY,…), การ Hash-join, การ bitmap merge หรื อแม้ แต่ bulk loading
เมื่อเราใช้ Automatic Memory Management หน่วยความจา PGA จะถูกจัดสรรโดยยึดตามค่า
MEMORY_TARGET ในกรณีทเปิ ดการใช้ งาน ASMM หรื อ MSMM เราจาเป็ นที่จะต้ องเปิ ดการใช้ งาน การจัดการ
ี่
หน่วยความจา PGA อัตโนมัติ
หมายเหตุ การจัดการหน่วยความจา PGA (Automatic/Manual) จะถูกพิจารณาจากพารามิเตอร์
WORKAREA_SIZE_POLICY ทังในระดับ session และ system ค่าของพารามิเตอร์ คือ AUTO หรื อ MANUAL (ค่า
้
เริ่ มต้ นคือ AUTO)
เราสามารถตรวจสอบการใช้ งาน PGA
SQL> SELECT * FROM V$PGASTAT;
NAME VALUE UNIT
---------------------------------------------------------------- ---------- ------------
aggregate PGA target parameter 247463936 bytes
18. aggregate PGA auto target 80547840 bytes
global memory bound 49491968 bytes
total PGA inuse 157964288 bytes
total PGA allocated 192398336 bytes
maximum PGA allocated 240287744 bytes
total freeable PGA memory 17891328 bytes
process count 49
max processes count 55
PGA memory freed back to OS 777781248 bytes
total PGA used for auto workareas 0 bytes
maximum PGA used for auto workareas 6317056 bytes
total PGA used for manual workareas 0 bytes
maximum PGA used for manual workareas 0 bytes
over allocation count 0
bytes processed 840646656 bytes
extra bytes read/written 0 bytes
cache hit percentage 100 percent
recompute count (total) 6224
aggregate PGA auto target : จานวนหน่วยความจาของ PGA ที่สามารถใช้ สาหรับ work area เมื่อใช้ โหมดอัตโนมัติ
total PGA used for auto workarea : ให้ คาหน่วยความจา PGA ที่เกิดขึ ้นจริ งโดยระบบ ส่วน 'maximum PGA
่
used for auto workareas' ให้ คาที่สงสุดที่เคยเกิดขึ ้นตังแต่ instance startup
่ ู ้
total PGA in used : หน่วยความจา PGA ทังหมดที่ใช้
้
over allocation count : สามารถเกิดขึ ้นได้ ถ้าค่า PGA_AGGREGATE_TARGET มีขนาดเล็กเกินไป ค่านี ้คือจานวน
ครังที่ Oracle ใช้ หน่วยความจา PGA พิเศษ (Extra)
้
cache hit percentage : คานวณประสิทธิภาพการใช้ งานหน่วยความจา PGA
total bytes processed * 100
PGA Cache Hit Ratio = ------------------------------------------------------
(total bytes processed + total extra bytes read/written)
รูปภาพ 1-05 รายละเอียดการใช้ หน่วยความจา PGA จาก EM