20
การปรับปรุงประสิทธิภาพฐานข้อมูล 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

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

  • Upload
    na

  • View
    3.925

  • Download
    1

Embed Size (px)

DESCRIPTION

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

Citation preview

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

การปรบปรงประสทธภาพฐานขอมล 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

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

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

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

- ถาเซตคา 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/Java

pool/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_TARGET PGA_AGGREGATE_TARGET DB_CACHE_SIZE SHARED_POOL_SIZE LARGE_POOL_SIZE JAVA_POOL_SIZE

1.2 การตรวจสอบการท างานของ Automatic Memory Management

จากหวขอ 1.1 ไดพดถงการใช Automatic Memory Management หวขอนจะแสดงตวอยางการตรวจสอบ

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

การใชหนวยความจ าหรอการปรบปลยนคาของหนวยความจ า หากตองการตรวจสอบการจดสรรหนวยความจ าในปจจบน เราสามารถใช V$MEMORY_DYNAMIC_COMPONENTS หรอเชคจาก Enterprise Manager ดงรป 1-02

รปภาพ 1-02 แสดงการจดสรรหนวยความจ าระหวาง SGA และ PGA ใน Enterprise Manager

หมายเหต กรณการยกเลกการใชงาน AMM นน เราจ าเปนตองเอาพารามเตอร memory_target ออกจาก init ไฟล

(ถาเพยง memory_target=0 ใน init ไฟล) กรณท 1

SQL> !strings spfileorcl.ora | grep memory

*.memory_max_target=0

*.memory_target=0

SQL> startup

ORA-00843: Parameter not taking MEMORY_MAX_TARGET into account

ORA-00849: SGA_TARGET 1073741824 cannot be set to more than MEMORY_MAX_TARGET 0.

กรณท 2

SQL> !strings spfileorcl.ora | grep memory

*.memory_max_target=1073741824

SQL> startup ORACLE 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

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

ท MEMORY_SIZE_FACTOR เทากบ 1 แสดงใหเหนขนาดของหนวยความจ าปจจบน (900M), และ ESTD_DB_TIME แสดง DB TIME ทตองใชในภาระงานปจบน(1085) จากผลลพทจะเหนวา การเพม MEMORY_TARGET เปน 2x (1800M) ไมไดท าให DB TIME ลดลง กรณนเราสามารถเชคจากEnterprise

Manager ดงรป 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_size db_recycle_cache_size

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

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

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

/

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 ใหมากกวาศนย

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

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 |

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

| 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 R e s u l t C a c h e M e m o r y R e p o r t [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

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

SQL> execute dbms_result_cache.flush PL/SQL procedure successfully completed. R e s u l t C a c h e M e m o r y R e p o r t [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

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

หมายเหต เราสามารถใช 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

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

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

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

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;

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

END department_pks;

/ DECLARE

dept_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

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

หมายเหต บน 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

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

------------ ------------ ------------ 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.html

1.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)

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

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

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

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

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

เราสามารถใช 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,

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

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)