การเพิ่มประสิทธิภาพ Instance memory - Oracle 11G

5,523 views
5,347 views

Published on

เนื่องจากผู้ใช้ฐานข้อมูล Oracle มีมากขึ้นทุกๆ วัน การที่เราได้เรียนรู้การปรับแต่งประสิทธิภาพ จะช่วยให้เราเข้าใจและได้ไอเดียใหม่ๆ เพื่อนำมาปรับปรุงงานให้มีประสิทธิภาพมากขึ้น เนื้อหาบทความนี้ผมขอใช้ฐานข้อมูล Oracle 11g เป็นตัวนำเสนอ เนื้อหาของบทความเป็นการเสนอแนะเท่านั้น ไม่ได้พูดถึงทั้งหมดของการปรับปรุงประสิทธิภาพฐานข้อมูล
วัตถุประสงค์ของบทความ เพื่อให้เป็นประโยชน์แก่ผู้สนใจและผู้ใช้ฐานข้อมูล Oracle

Published in: Education
0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,523
On SlideShare
0
From Embeds
0
Number of Embeds
22
Actions
Shares
0
Downloads
313
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

การเพิ่มประสิทธิภาพ Instance memory - Oracle 11G

  1. 1. การปรั บปรุ งประสิทธิภาพฐานข้ อมูล Oracle 11gเกริ่นนา เนื่องจากผู้ใช้ ฐานข้ อมูล Oracle มีมากขึ ้นทุกๆ วัน การที่เราได้ เรี ยนรู้การปรับแต่งประสิทธิภาพ จะช่วยให้ เราเข้ าใจและได้ ไอเดียใหม่ๆ เพื่อนามาปรับปรุงงานให้ มีประสิทธิภาพมากขึ ้น เนื ้อหาบทความนี ้ผมขอใช้ ฐานข้ อมูล Oracle11g เป็ นตัวนาเสนอ เนื ้อหาของบทความเป็ นการเสนอแนะเท่านัน ไม่ได้ พดถึงทังหมดของการปรับปรุ งประสิทธิภาพ ้ ู ้ฐานข้ อมูล วัตถุประสงค์ของบทความ เพื่อให้ เป็ นประโยชน์แก่ผ้ สนใจและผู้ใช้ ฐานข้ อมูล Oracle ู 1 การเพิ่มประสิทธิภาพ Instance Memory1.1 การใช้ Automatic Memory Management บนฐานข้ อมูล Oracle 11g เราจะรู้จก Automatic Memory Management ซึงฐานข้ อมุลจะจัดการปรับปรุง ั ่instance memory เองโดยอัตโนมัติ การจัดการหน่วยความจาอัตโนมัตินี ้จะขึ ้นกับขนาดของพารามิเตอร์MEMORY_TARGET และ MEMORY_MAX_TARGET โดยที่ฐานข้ อมูลจะปรับปรุ งหน่วยความจาระหว่าง SystemGlobal 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. 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
  3. 3. - ถ้ าเซตค่า SGA_TARGET และ PGA_AGGREGATE_TARGET ค่าของ SGA และ PGA จะถูกพิจารณาจากสองค่าข้ างต้ นตามลาดับ ดังนัน MEMORY_TARGET >= SGA_TARGET + PGA_AGGREGATE_TARGET ้ - ถ้ าเซตค่า SGA_TARGET แต่ไม่ได้ เซตค่า PGA_AGGREGATE_TARGET ดังนัน ้PGA_AGGREGATE_TARGET = MEMORY_TARGET - SGA_TARGET - ถ้ าเซตค่า PGA_AGGREGATE_TARGET แต่ไม่ได้ เซตค่า SGA_TARGET ดังนัน SGA_TARGET = ้min(MEMORY_TARGET - PGA_AGGREGATE_TARGET, SGA_MAX_SIZE (ถ้ าถูกเซตค่าโดยผู้ใช้ )) - ถ้ าไม่ได้ เซตค่า SGA_TARGET และ PGA_AGGREGATE_TARGET ค่าของ SGA และ PGA จะถูกปรับปรุ งโดยอัตโนมัติ จากค่าของ MEMORY_TARGET อย่างไรก็ตามกรณี Instance เริ่ มต้ นจะถูกเซต 60% สาหรับ SGA และ40% สาหรับ PGAถ้ า MEMORY_TARGET = 0 - ถ้ าเซตค่า SGA_TARGET จะทาให้ สวนประกอบของหน่วยความจาใน SGA จะถูกปรับปรุ งโดยอัตโนมัติ ่เหมือนกับเวอร์ ชน 10g. ส่วน PGA จะถูกปรับปรุงโดยอัตโนมัติอย่างอิสระ แม้ วาจะถูกเซตค่าหรื อไม่ ั ่ - ถ้ าไม่ได้ เซตค่า SGA_TARGET ส่วนประกอบ (Database buffer cache/Shared pool/Large pool/Javapool/Streams pool) ของหน่วยความจาใน SGA จะต้ องถูกเซตค่า - ถ้ าเซตค่า MEMORY_MAX_TARGET และ MEMORY_TARGET = 0 การทางานของหน่วยความจาจะไม่ต่างจาก 10gR2 คือไม่มีการปรับปรุงหน่วยความจาอัตโนมัติระหว่าง SGA และ PGAจากรูป 1-01 เราจะต้ องปิ ดค่าของพารามิเตอร์ SGA_TARGET และ PGA_AGGREGATE_TARGET ด้ วย SQL> alter system set PGA_AGGREGATE_TARGET=0; System altered. SQL> alter system set SGA_TARGET=0; System altered.หมายเหตุ แม้ วาค่า SGA_TARGET จะเป็ นศูนย์ แต่ในกรณีที่ใช้ RESULT CACHE เราอาจจาเป็ นต้ องเอาพารามิเตอร์ ่SGA_TARGET ออกจากพารามิเตอร์ ไฟล์ เพราะจะทาให้ เมื่อ start Instance ในครังต่อไป ส่งผลให้ RESULT CACHE ้ไม่ ENABLED (อ้ างอิง http://surachartopun.com/2011/03/result-cache-can-not-be-enabled.html)เราสามารถใช้ Automatic Memory Management ด้ วยการเซตค่าให้ กบพารามิเตอร์ MEMORY_TARGET มากกว่า ัศูนย์ จากนันไม่ต้องสนใจกับพารามิเตอร์ ตอไปนี ้ โดยการไม่ต้องเซตค่า ้ ่SGA_TARGETPGA_AGGREGATE_TARGETDB_CACHE_SIZESHARED_POOL_SIZELARGE_POOL_SIZEJAVA_POOL_SIZE1.2 การตรวจสอบการทางานของ Automatic Memory Management จากหัวข้ อ 1.1 ได้ พดถึงการใช้ Automatic Memory Management หัวข้ อนี ้จะแสดงตัวอย่างการตรวจสอบ ู
  4. 4. การใช้ หน่วยความจาหรื อการปรับปลียนค่าของหน่วยความจา หากต้ องการตรวจสอบการจัดสรรหน่วยความจาในปั จจุบน ่ ัเราสามารถใช้ V$MEMORY_DYNAMIC_COMPONENTS หรื อเช็คจาก Enterprise Manager ดังรูป 1-02รูปภาพ 1-02 แสดงการจัดสรรหน่วยความจาระหว่าง SGA และ PGA ใน Enterprise Managerหมายเหตุ กรณีการยกเลิกการใช้ งาน AMM นัน เราจาเป็ นต้ องเอาพารามิเตอร์ memory_target ออกจาก init ไฟล์ ้(ถ้ าเพียง memory_target=0 ใน init ไฟล์)กรณีที่ 1SQL> !strings spfileorcl.ora | grep memory*.memory_max_target=0*.memory_target=0SQL> startupORA-00843: Parameter not taking MEMORY_MAX_TARGET into accountORA-00849: SGA_TARGET 1073741824 cannot be set to more than MEMORY_MAX_TARGET 0.กรณีที่ 2SQL> !strings spfileorcl.ora | grep memory*.memory_max_target=1073741824SQL> startupORACLE instance started.หากต้ องการปรับแต่งค่า MEMORY_TARGET เราสามารถใช้ V$MEMORY_TARGET_ADVICE เพื่อช่วยในการพิจารณา ก่อนปรับแต่งค่าได้ SQL> select * from v$memory_target_advice order by memory_size; MEMORY_SIZE MEMORY_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR VERSION ----------- ------------------ ------------ ------------------- ---------- 450 .5 1286 1.1853 8 675 .75 1100 1.0138 8 900 1 1085 1 8 1125 1.25 1085 1 8 1350 1.5 1085 1 8 1575 1.75 1085 1 8 1800 2 1085 1 8
  5. 5. ที่ MEMORY_SIZE_FACTOR เท่ากับ 1 แสดงให้ เห็นขนาดของหน่วยความจาปั จจุบน (900M), และ ัESTD_DB_TIME แสดง DB TIME ที่ต้องใช้ ในภาระงานปั จบน(1085) จากผลลัพท์จะเห็นว่า การเพิ่ม ุ ัMEMORY_TARGET เป็ น 2x (1800M) ไม่ได้ ทาให้ DB TIME ลดลง กรณีนี ้เราสามารถเช็คจากEnterpriseManager ดังรู ป 1-03รูปภาพ 1-03 แสดง Memory Size Advice บน Enterprise Managerนอกจากนี ้เรายังสามารถใช้ V$MEMORY_RESIZE_OPS เพื่อแสดงข้ อมูลเกี่ยวกับการดาเนินงานล่าสุด (800 rows) ในการปรับขนาดหน่วยความจา (ทังแบบอัตโนมัติและด้ วยตนเอง) ้1.3 การใช้ งาน Multiple Buffer Pools ฐานข้ อมูลใช้ Buffer Pool ในการเก็บข้ อมูลที่อานจาก disk กรณีนี ้เราใช้ Automatic Memory ่Management ดังนันหน่วยความจาในส่วนของ Buffer Pool จะถูกปรับเปลียนโดยอัตโนมัติ อาจส่งผลให้ BUFFER ้ ่POOL มีขนาดที่น้อย และส่งผลให้ segment ที่มีการใช้ งานบ่อยๆ ไม่อยูใน Buffer กรณีนี ้เราสามารถใช้ Multiple ่Buffer Pools การใช้ งาน Multiple Buffer Pools ต้ องมีการเซตค่าให้ กบ KEEP pool และ RECYCLE pool จากนัน ั ้ต้ องระบุคาหลัก BUFFER_POOL ในส่วน STORAGE clause ของ segmentหมายเหตุ KEEP pool และ RECYCLE pool ไม่ได้ เป็ นส่วนหนึงของ Default Buffer Cache ่KEEP pool สาหรับ segment ที่ต้องการให้ อยูใน BUFFER นานกว่า Default Buffer Cache ่RECYCLE pool สาหรับ segment ที่ไม่ต้องการให้ อยูใน BUFFER นานเท่ากับ Default Buffer Cache ่การใช้ งาน Multiple Buffer Pools เริ่ มต้ นด้ วยการเซต 2 พารามิเตอร์db_keep_cache_sizedb_recycle_cache_size
  6. 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. 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. 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. 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. 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. 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. 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. 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 isTYPE 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_pksAS 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 WHEREdepartment_id = dept_id; RETURN result; END get_dept_info;
  14. 14. END department_pks;/DECLAREdept_id number := 50;AVG_SAL number;NO_OF_EMP number;BEGIN AVG_SAL := department_pks.get_dept_info(50).average_salary; NO_OF_EMP :=department_pks.get_dept_info(50).number_of_employees; dbms_output.put_line(dept_id:= ||dept_id ); dbms_output.put_line( average_salary= || avg_sal); dbms_output.put_line( Number_of_employees ||no_of_emp );END;/1.6 การใช้ งาน Database Smart Flash Cache ฟั งก์ชนการทางานของ Database Smart Flash Cache สาหรับ database block ที่ไม่ได้ ถกแก้ ไขแล้ ว และ ั ูจะต้ องถูกนาออกจาก SGA Buffer Cache เพื่อเหลือพื ้นที่ในหน่วยความจาให้ กบ block อื่นๆ ั หาก block ได้ รับการเลือกเพื่อแก้ ไข จากนัน dirty block จะถูกเขียนลง Disk ด้ วย DBWR จากนันจะถูกเขียน ้ ้ลง Database Smart Flash Cache ดังนันเมื่อต้ องการใช้ งาน block นันอีกครังมันจะถูกอ่านจาก Database Smart ้ ้ ้Flash Cache กลับไปที่ SGA แต่ถ้า block ที่ต้องการไม่ถกพบใน SGA Buffer Cache หรื อ Database Smart Flash ูCache มันจะอ่านจาก Disk ดังรู ป 1-04 ประโยชน์ของ Database Smart Flash Cache นันจะช่วยลด "db file sequential read" wait event ้รูปภาพ 1-04 Lifecycle ของ data block with กับ Database Smart Flash Cache
  15. 15. หมายเหตุ บน Exadata Environment เราจะใช้ Exadata Smart Flash Cache ซึงการจัดการกับ flash cache จะทา ่ที่ Exadata Storage ดังนันบน Exadata Environment จะไม่สนับสนุนการทางานของ Database Smart Flash ้Cacheการใช้ งาน Database Smart Flash Cache เราจะต้ องมีการกาหนดค่าให้ กบพารามิเตอร์ ั  DB_FLASH_CACHE_FILE ระบุตาแหน่งของ flash device  DB_FLASH_CACHE_SIZE จานวน flash storage ที่สามารถใช้ งานได้ สาหรับ Database Smart Flash Cacheหมายเหตุ Database Smart Flash Cache เป็ นฟี เจอร์ บน 11gR2 และสามารถใช้ ได้ บน Oracle Linux และ Solaris SQL> alter system set db_flash_cache_file=/dev/sdc scope=spfile; System altered. SQL> alter system set db_flash_cache_size=10G 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 db_flash_cache_file NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_flash_cache_file string /dev/sdc SQL> show parameter db_flash_cache_size NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_flash_cache_size big integer 10Gเราสามารถตรวจสอบ database block ทีมีการย้ ายจาก Buffer Cache ไปยัง Flash Cache ่ SQL> SELECT SUM(CASE WHEN b.status LIKE flash% THEN 1 else 0 END) flash_blocks, SUM(CASE WHEN b.status LIKE flash% THEN 0 else 1 END) cache_blocks,count(*) total_blocks FROM v$bh b; FLASH_BLOCKS CACHE_BLOCKS TOTAL_BLOCKS
  16. 16. ------------ ------------ ------------ 3132 3427 6559เมื่อเราเปิ ด Database Smart Flash Cache ใช้ งาน ทุกๆ object จะใช้ งาน flash cache (default) และจะถูกเอาออกจาก flash cache ซึงใช้ อลกอริ ทมเดียวกับของ buffer cache แต่ถ้าต้ องการให้ object นันเก็บอยูใน flash cache นาน ่ ั ึ ้ ่เท่าที่ขนาดพื ้นที่ flash cache ใหญ่พอ เราสามารถระบุได้ ที่ object นันๆ ้ SQL> create table tb_test01 as select * from all_objects where rownum <=10; Table created. SQL> select table_name, flash_cache from user_tables where table_name=TB_TEST01; TABLE_NAME FLASH_C ------------------------------ ------- TB_TEST01 DEFAULT SQL> alter table TB_TEST01 storage( flash_cache keep); Table altered. SQL> select table_name, flash_cache from user_tables where table_name=TB_TEST01; TABLE_NAME FLASH_C ------------------------------ ------- TB_TEST01 KEEPหาก object ไหนไม่ต้องการใช้ flash cache เราสามารถ ALTER TABLE … storage( flash_cache NONE)การตรวจสอบการใช้ งาน flash cache เราสามารถเช็คได้ จาก V$SYSSTAT SQL> select * from v$sysstat where name like flash cache%;หมายเหตุ หากต้ องการขจัด block ใน flash cache เราสามารถทาได้ โดย flush buffer_cache หรื อเซตค่าdb_flash_cache_size เป็ นศูนย์อ้ างอิง http://surachartopun.com/2010/02/how-to-clear-db-blocks-in-flash-cache.html1.7 ปรั บปรุ ง Redo Log Buffer การเปลียนแปลงข้ อมูลในฐานข้ อมูลจะมีการสร้ างข้ อมูลลงใน log buffer จากนัน Server Process (LGWR) ่ ้จะเขียนข้ อมูลที่อยูใน redo log buffer ไปที่ Disk(online redo log) ขนาดของ redo log buffer ถูกพิจารณาจาก ่พารามิเตอร์ LOG_BUFFER เราสามารถพิจารณาสถิติของ log buffer SQL> SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME = redo buffer allocation retries;ค่าที่ได้ ควรอยูใกล้ ศนย์ ถ้ าค่านี ้เพิ่มขึ ้นอย่างต่อเนื่อง จากนันจะทาให้ มการรอพื ้นที่ใน redo log buffer สาเหตุอาจมา ่ ู ้ ีจาก log buffer ที่มีขนาดเล็ก หรื อการ checkpointing ดังนันจาเป็ นต้ องเพิมขนาดของ LOG_BUFFER (bytes) ้ ่
  17. 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 51200001.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. 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) 6224aggregate 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 * 100PGA Cache Hit Ratio = ------------------------------------------------------ (total bytes processed + total extra bytes read/written)รูปภาพ 1-05 รายละเอียดการใช้ หน่วยความจา PGA จาก EM
  19. 19. เราสามารถใช้ Enterprise Manager เพื่อคาดเดาจานวนของพื ้นที่ work area (optimal, one-pass, multi-pass)ด้ วยการเปลียนค่า PGA_AGGREGATE_TARGET ดังรูป 1-05 ก่อนปรับเปลียนค่าสาหรับ PGA หรื อใช้ Performance ่ ่Dynamic View เช่น V$PROCESS, V$PROCESS_MEMORY, V$SQL_WORKAREA_HISTOGRAM,V$SQL_WORKAREA_ACTIVE, V$SQL_WORKAREA ในการพิจารณาหมายเหตุ เมื่อเราใช้ การจัดการหน่วยความจา PGA อัตโนมัติ PGA ที่จะถูกจากัดในแต่ละ session นัน ขึ ้นอยูกบค่า ้ ่ ัPGA_AGGREGATE_TARGET เช่น PGA_AGGREGATE_TARGET น้ อยกว่า 1GB แต่ละ session จะถูกจากัดในการใช้ หน่วยความจา PGA ที่ 200M แต่ถ้า PGA_AGGREGATE_TARGET มากกว่า 1GB แต่ละ session จะถูกจากัดในการใช้ หน่วยความจา PGA ที่ 20% ของ PGA_AGGREGATE_TARGETตัวอย่างการใช้ Performance Dynamic View :ใช้ V$PROCESS หาหน่วยความจา PGA แต่ละ process SQL> SELECT PROGRAM, PGA_USED_MEM, PGA_ALLOC_MEM, PGA_FREEABLE_MEM, PGA_MAX_MEM FROM V$PROCESS;หา Cursor ที่ใช้ งาน one-pass หรื อ multi-pass SQL> SELECT sql_text, sum(onepass_executions) onepass_cnt, sum(multipasses_executions) mpass_cnt FROM V$SQL s, V$SQL_WORKAREA wa WHERE s.address = wa.address GROUP BY sql_text HAVING sum(onepass_executions+multipasses_executions)>0 /หาข้ อมูลเกี่ยวกับ work area ที่ใช้ งานอยู่ SQL> SELECT TO_NUMBER(DECODE(sid, 65535, NULL, sid)) sid,
  20. 20. operation_type OPERATION, TRUNC(expected_size/1024) ESIZE, TRUNC(actual_mem_used/1024) MEM, TRUNC(max_mem_used/1024) MAXMEM, number_passes PASS, TRUNC(tempseg_size/1024) TSIZE FROM V$SQL_WORKAREA_ACTIVE ORDER BY 1,2 / SID OPERATION ESIZE MEM MAXMEM PASS TSIZE ---------- -------------------- ---------- ---------- ---------- ---------- ---------- 508 GROUP BY (HASH) 5957 1264 1264 0 810 HASH-JOIN 3879 1484 1484 0 810 HASH-JOIN 3879 1484 1484 0 810 HASH-JOIN 3501 881 881 0 810 HASH-JOIN 4041 1505 1505 0การเพิมประสิทธิภาพ Instance Memory จะช่วยให ้การทางานของฐานข ้อมูลมีประสิทธิภาพมากขึน ่ ้เขียนโดย: @surachart (surachartopun.com)

×