oracleskill

Home TUTORIAL ดักจับ SQL ที่ทำให้เกิดการอ่านดิสก์สูง

ดักจับ SQL ที่ทำให้เกิดการอ่านดิสก์สูง

การ เขียน SQL statement นอกจาก จะต้องได้ผลลัพธ์ ตามต้องการ และ ถูกต้อง แล้ว ควรต้องคำนึงถึง ผลกระทบ กับ ความมีประสิทธิภาพ ของฐานข้อมูล (database performance ) ด้วย

ถ้า SQL statement ที่เราเขียนนั้น ทำให้เกิดการอ่านดิสก์สูง ทำให้เกิด disk I/O wait มาก จะทำให้ database performance ตกต่ำลง นำมาซึ่ง การตอบสนองของฐานข้อมูลช้า ตามมาติดๆด้วย การบ่นของ user ผู้ใช้งาน -_-''

เราสามารถดักจับ SQL statement ที่ทำให้เกิดการอ่านดิสก์สูง ได้ด้วยการใช้ script high_disk_read.sql ต่อไปนี้

  ไฟล์ high_disk_read.sql  
 
set echo off
set feedback off

DEFINE blocks_read = 1000 (NUMBER)

COLUMN parsing_user_id  FORMAT 9999999 HEADING 'User Id'
COLUMN executions       FORMAT 9999     HEADING 'Exec'
COLUMN sorts            FORMAT 99999    HEADING 'Sorts'
COLUMN command_type     FORMAT 99999    HEADING 'CmdT'
COLUMN disk_reads       FORMAT 999,999,999 HEADING 'Block Reads'
COLUMN sql_text         FORMAT a40  HEADING 'Statement' WORD_WRAPPED

SET LINES 130
SET PAGESIZE 500

SELECT parsing_user_id, executions, sorts, command_type,
disk_reads, sql_text
FROM v$sqlarea
WHERE disk_reads > &&blocks_read
ORDER BY disk_reads;
/

set echo off
SET LINES 80
 
     
  เวลาเอาไปใช้งาน ก็เอาไป run ใน sql*plus ด้วย user SYS หรือ SYSTEM ดังนี้  
 
SQL> connect system/password@yourDB
SQL> @/path/to/high_disk_read.sql
 
  สำหรับค่า DEFINE blocks_read = 1000 (NUMBER) เราสามารถเปลี่ยนตัวเลขได้ ตามต้องการครับ