SlideShare a Scribd company logo
1 of 20
Download to read offline
การปรั บปรุ งประสิทธิภาพฐานข้ อมูล 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
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
- ถ้ าเซตค่า 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 หัวข้ อนี ้จะแสดงตัวอย่างการตรวจสอบ
                            ู
การใช้ หน่วยความจาหรื อการปรับปลียนค่าของหน่วยความจา หากต้ องการตรวจสอบการจัดสรรหน่วยความจาในปั จจุบน
                                 ่                                                                  ั
เราสามารถใช้ 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
ที่ 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
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
/

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 ให้ มากกว่าศูนย์
           ่
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 |
| 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
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
หมายเหตุ เราสามารถใช้ 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
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
     ้
 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;
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
หมายเหตุ บน 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
------------ ------------ ------------
               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)
                                                                      ้           ่
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
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
เราสามารถใช้ 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,
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)

More Related Content

What's hot

Sga internals
Sga internalsSga internals
Sga internalssergkosko
 
5G NR parameters
5G NR parameters5G NR parameters
5G NR parametersSasi Reddy
 
[Oracle DBA & Developer Day 2014] しばちょう先生による特別講義! RMANの運用と高速化チューニング
[Oracle DBA & Developer Day 2014] しばちょう先生による特別講義! RMANの運用と高速化チューニング[Oracle DBA & Developer Day 2014] しばちょう先生による特別講義! RMANの運用と高速化チューニング
[Oracle DBA & Developer Day 2014] しばちょう先生による特別講義! RMANの運用と高速化チューニングオラクルエンジニア通信
 
10 Problems with your RMAN backup script - whitepaper
10 Problems with your RMAN backup script - whitepaper10 Problems with your RMAN backup script - whitepaper
10 Problems with your RMAN backup script - whitepaperYury Velikanov
 
RFC destination step by step
RFC destination step by stepRFC destination step by step
RFC destination step by stepRipunjay Rathaur
 
Ewaの見方‗it部門マネジメント向け v2
Ewaの見方‗it部門マネジメント向け v2Ewaの見方‗it部門マネジメント向け v2
Ewaの見方‗it部門マネジメント向け v2Shiroh Kinoshita
 
SAP MM Configuration Step by Step guide by Tata Mcgraw hill
SAP MM Configuration Step by Step guide by Tata Mcgraw hillSAP MM Configuration Step by Step guide by Tata Mcgraw hill
SAP MM Configuration Step by Step guide by Tata Mcgraw hillVenet Dheer
 
Oracle ACFS High Availability NFS Services (HANFS)
Oracle ACFS High Availability NFS Services (HANFS)Oracle ACFS High Availability NFS Services (HANFS)
Oracle ACFS High Availability NFS Services (HANFS)Anju Garg
 
Reverse pricing procedure
Reverse pricing procedureReverse pricing procedure
Reverse pricing proceduretejesbadani
 
Data archiving in sales and distribution (sd)
Data archiving in sales and distribution (sd)Data archiving in sales and distribution (sd)
Data archiving in sales and distribution (sd)Piyush Bose
 
Ebook abap-101-exercises-beginner-starting-from-scratch
Ebook abap-101-exercises-beginner-starting-from-scratchEbook abap-101-exercises-beginner-starting-from-scratch
Ebook abap-101-exercises-beginner-starting-from-scratchYandisa Phillip
 
Zte utran ur11.1 optional feature description
Zte utran ur11.1 optional feature descriptionZte utran ur11.1 optional feature description
Zte utran ur11.1 optional feature descriptionMd Kamruzzaman
 
Sap MM-configuration-step-by-step-guide
Sap MM-configuration-step-by-step-guideSap MM-configuration-step-by-step-guide
Sap MM-configuration-step-by-step-guideVenet Dheer
 
279934373-6-GSM-Paging-Affecting-Factors-Check-Methods-and-Tools-and-Delivera...
279934373-6-GSM-Paging-Affecting-Factors-Check-Methods-and-Tools-and-Delivera...279934373-6-GSM-Paging-Affecting-Factors-Check-Methods-and-Tools-and-Delivera...
279934373-6-GSM-Paging-Affecting-Factors-Check-Methods-and-Tools-and-Delivera...ssuser38e5dc1
 
Oracle Database SQL Tuning Concept
Oracle Database SQL Tuning ConceptOracle Database SQL Tuning Concept
Oracle Database SQL Tuning ConceptChien Chung Shen
 
Oracle Advanced Security Transparent Data Encryptionのご紹介
Oracle Advanced Security Transparent Data Encryptionのご紹介Oracle Advanced Security Transparent Data Encryptionのご紹介
Oracle Advanced Security Transparent Data Encryptionのご紹介オラクルエンジニア通信
 
Sap mm-configuration-step-by-step-guide
Sap mm-configuration-step-by-step-guideSap mm-configuration-step-by-step-guide
Sap mm-configuration-step-by-step-guidevenkat1571
 

What's hot (20)

Sap sd org
Sap sd org Sap sd org
Sap sd org
 
AWR Sample Report
AWR Sample ReportAWR Sample Report
AWR Sample Report
 
Sga internals
Sga internalsSga internals
Sga internals
 
5G NR parameters
5G NR parameters5G NR parameters
5G NR parameters
 
[Oracle DBA & Developer Day 2014] しばちょう先生による特別講義! RMANの運用と高速化チューニング
[Oracle DBA & Developer Day 2014] しばちょう先生による特別講義! RMANの運用と高速化チューニング[Oracle DBA & Developer Day 2014] しばちょう先生による特別講義! RMANの運用と高速化チューニング
[Oracle DBA & Developer Day 2014] しばちょう先生による特別講義! RMANの運用と高速化チューニング
 
10 Problems with your RMAN backup script - whitepaper
10 Problems with your RMAN backup script - whitepaper10 Problems with your RMAN backup script - whitepaper
10 Problems with your RMAN backup script - whitepaper
 
RFC destination step by step
RFC destination step by stepRFC destination step by step
RFC destination step by step
 
Ewaの見方‗it部門マネジメント向け v2
Ewaの見方‗it部門マネジメント向け v2Ewaの見方‗it部門マネジメント向け v2
Ewaの見方‗it部門マネジメント向け v2
 
SAP MM Configuration Step by Step guide by Tata Mcgraw hill
SAP MM Configuration Step by Step guide by Tata Mcgraw hillSAP MM Configuration Step by Step guide by Tata Mcgraw hill
SAP MM Configuration Step by Step guide by Tata Mcgraw hill
 
Oracle ACFS High Availability NFS Services (HANFS)
Oracle ACFS High Availability NFS Services (HANFS)Oracle ACFS High Availability NFS Services (HANFS)
Oracle ACFS High Availability NFS Services (HANFS)
 
Reverse pricing procedure
Reverse pricing procedureReverse pricing procedure
Reverse pricing procedure
 
Data archiving in sales and distribution (sd)
Data archiving in sales and distribution (sd)Data archiving in sales and distribution (sd)
Data archiving in sales and distribution (sd)
 
Ebook abap-101-exercises-beginner-starting-from-scratch
Ebook abap-101-exercises-beginner-starting-from-scratchEbook abap-101-exercises-beginner-starting-from-scratch
Ebook abap-101-exercises-beginner-starting-from-scratch
 
Zte utran ur11.1 optional feature description
Zte utran ur11.1 optional feature descriptionZte utran ur11.1 optional feature description
Zte utran ur11.1 optional feature description
 
Sap MM-configuration-step-by-step-guide
Sap MM-configuration-step-by-step-guideSap MM-configuration-step-by-step-guide
Sap MM-configuration-step-by-step-guide
 
279934373-6-GSM-Paging-Affecting-Factors-Check-Methods-and-Tools-and-Delivera...
279934373-6-GSM-Paging-Affecting-Factors-Check-Methods-and-Tools-and-Delivera...279934373-6-GSM-Paging-Affecting-Factors-Check-Methods-and-Tools-and-Delivera...
279934373-6-GSM-Paging-Affecting-Factors-Check-Methods-and-Tools-and-Delivera...
 
Oracle Database SQL Tuning Concept
Oracle Database SQL Tuning ConceptOracle Database SQL Tuning Concept
Oracle Database SQL Tuning Concept
 
Oracle Advanced Security Transparent Data Encryptionのご紹介
Oracle Advanced Security Transparent Data Encryptionのご紹介Oracle Advanced Security Transparent Data Encryptionのご紹介
Oracle Advanced Security Transparent Data Encryptionのご紹介
 
SAP SD General Terms
SAP SD General TermsSAP SD General Terms
SAP SD General Terms
 
Sap mm-configuration-step-by-step-guide
Sap mm-configuration-step-by-step-guideSap mm-configuration-step-by-step-guide
Sap mm-configuration-step-by-step-guide
 

Viewers also liked

ออราเคิล (Oracle) Statspack (ติดตั้งและใช้งานเบื้องต้น)
ออราเคิล (Oracle) Statspack (ติดตั้งและใช้งานเบื้องต้น)ออราเคิล (Oracle) Statspack (ติดตั้งและใช้งานเบื้องต้น)
ออราเคิล (Oracle) Statspack (ติดตั้งและใช้งานเบื้องต้น)N/A
 
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draftการตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draftN/A
 
Oracle Database 11g Product Family
Oracle Database 11g Product FamilyOracle Database 11g Product Family
Oracle Database 11g Product FamilyN/A
 
Basic - Oracle Edition Based Redefinition Presentation
Basic - Oracle Edition Based Redefinition PresentationBasic - Oracle Edition Based Redefinition Presentation
Basic - Oracle Edition Based Redefinition PresentationN/A
 
Apex thaibook 01_draft
Apex thaibook 01_draftApex thaibook 01_draft
Apex thaibook 01_draftN/A
 
FIXING BLOCK CORRUPTION (RMAN) on 11G
FIXING BLOCK CORRUPTION (RMAN) on 11GFIXING BLOCK CORRUPTION (RMAN) on 11G
FIXING BLOCK CORRUPTION (RMAN) on 11GN/A
 
Test Dml With Nologging
Test Dml With NologgingTest Dml With Nologging
Test Dml With NologgingN/A
 
บทที่ 2 (1)
บทที่ 2 (1)บทที่ 2 (1)
บทที่ 2 (1)nopphanut
 

Viewers also liked (10)

ออราเคิล (Oracle) Statspack (ติดตั้งและใช้งานเบื้องต้น)
ออราเคิล (Oracle) Statspack (ติดตั้งและใช้งานเบื้องต้น)ออราเคิล (Oracle) Statspack (ติดตั้งและใช้งานเบื้องต้น)
ออราเคิล (Oracle) Statspack (ติดตั้งและใช้งานเบื้องต้น)
 
การตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draftการตรวจเช็คฐานข้อมูล Oracle v1 draft
การตรวจเช็คฐานข้อมูล Oracle v1 draft
 
Oracle Database 11g Product Family
Oracle Database 11g Product FamilyOracle Database 11g Product Family
Oracle Database 11g Product Family
 
Basic - Oracle Edition Based Redefinition Presentation
Basic - Oracle Edition Based Redefinition PresentationBasic - Oracle Edition Based Redefinition Presentation
Basic - Oracle Edition Based Redefinition Presentation
 
Apex thaibook 01_draft
Apex thaibook 01_draftApex thaibook 01_draft
Apex thaibook 01_draft
 
Database Tuning for e-Learning
Database Tuning for e-LearningDatabase Tuning for e-Learning
Database Tuning for e-Learning
 
FIXING BLOCK CORRUPTION (RMAN) on 11G
FIXING BLOCK CORRUPTION (RMAN) on 11GFIXING BLOCK CORRUPTION (RMAN) on 11G
FIXING BLOCK CORRUPTION (RMAN) on 11G
 
Test Dml With Nologging
Test Dml With NologgingTest Dml With Nologging
Test Dml With Nologging
 
Web 2.0 สู่ Library 2.0
Web 2.0 สู่ Library 2.0Web 2.0 สู่ Library 2.0
Web 2.0 สู่ Library 2.0
 
บทที่ 2 (1)
บทที่ 2 (1)บทที่ 2 (1)
บทที่ 2 (1)
 

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

MySQL Multi-Master Replication Using Tungsten Replicator 2.0.5
MySQL Multi-Master Replication Using Tungsten Replicator 2.0.5MySQL Multi-Master Replication Using Tungsten Replicator 2.0.5
MySQL Multi-Master Replication Using Tungsten Replicator 2.0.5Nont Banditwong
 
หน่วยประมวลผลของเครื่องคอมพิวเตอร์
หน่วยประมวลผลของเครื่องคอมพิวเตอร์หน่วยประมวลผลของเครื่องคอมพิวเตอร์
หน่วยประมวลผลของเครื่องคอมพิวเตอร์Ammarirat
 
หน่วยประมวลผลของเครื่องคอมพิวเตอร์
หน่วยประมวลผลของเครื่องคอมพิวเตอร์หน่วยประมวลผลของเครื่องคอมพิวเตอร์
หน่วยประมวลผลของเครื่องคอมพิวเตอร์Ammarirat
 
Firmware android 4.0.4 ics สำหรับ galaxy cooper
Firmware  android 4.0.4 ics สำหรับ galaxy cooperFirmware  android 4.0.4 ics สำหรับ galaxy cooper
Firmware android 4.0.4 ics สำหรับ galaxy cooperthanakit553
 
หน่วยประมวลผลของเครื่องคอมพิวเตอร์
หน่วยประมวลผลของเครื่องคอมพิวเตอร์หน่วยประมวลผลของเครื่องคอมพิวเตอร์
หน่วยประมวลผลของเครื่องคอมพิวเตอร์Jirayu Pansagul
 
หน่วยประมวลผลของเครื่องคอมพิวเตอร์
หน่วยประมวลผลของเครื่องคอมพิวเตอร์หน่วยประมวลผลของเครื่องคอมพิวเตอร์
หน่วยประมวลผลของเครื่องคอมพิวเตอร์Jirayu Pansagul
 

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

MySQL Multi-Master Replication Using Tungsten Replicator 2.0.5
MySQL Multi-Master Replication Using Tungsten Replicator 2.0.5MySQL Multi-Master Replication Using Tungsten Replicator 2.0.5
MySQL Multi-Master Replication Using Tungsten Replicator 2.0.5
 
หน่วยประมวลผลของเครื่องคอมพิวเตอร์
หน่วยประมวลผลของเครื่องคอมพิวเตอร์หน่วยประมวลผลของเครื่องคอมพิวเตอร์
หน่วยประมวลผลของเครื่องคอมพิวเตอร์
 
หน่วยประมวลผลของเครื่องคอมพิวเตอร์
หน่วยประมวลผลของเครื่องคอมพิวเตอร์หน่วยประมวลผลของเครื่องคอมพิวเตอร์
หน่วยประมวลผลของเครื่องคอมพิวเตอร์
 
Firmware android 4.0.4 ics สำหรับ galaxy cooper
Firmware  android 4.0.4 ics สำหรับ galaxy cooperFirmware  android 4.0.4 ics สำหรับ galaxy cooper
Firmware android 4.0.4 ics สำหรับ galaxy cooper
 
หน่วยประมวลผลของเครื่องคอมพิวเตอร์
หน่วยประมวลผลของเครื่องคอมพิวเตอร์หน่วยประมวลผลของเครื่องคอมพิวเตอร์
หน่วยประมวลผลของเครื่องคอมพิวเตอร์
 
หน่วยประมวลผลของเครื่องคอมพิวเตอร์
หน่วยประมวลผลของเครื่องคอมพิวเตอร์หน่วยประมวลผลของเครื่องคอมพิวเตอร์
หน่วยประมวลผลของเครื่องคอมพิวเตอร์
 

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

  • 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
  • 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/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 หัวข้ อนี ้จะแสดงตัวอย่างการตรวจสอบ ู
  • 4. การใช้ หน่วยความจาหรื อการปรับปลียนค่าของหน่วยความจา หากต้ องการตรวจสอบการจัดสรรหน่วยความจาในปั จจุบน ่ ั เราสามารถใช้ 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
  • 5. ที่ 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
  • 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;
  • 14. 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
  • 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. ------------ ------------ ------------ 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) ้ ่
  • 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
  • 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. 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)