Wednesday, November 29, 2006

ทำไมเราต้องทำ Performance Tuning?




ก็เพราะมันช้า ไม่ทันใจ

คำถามคือ มันช้าเพราะอะไร ความช้าเกิดได้จากหลายสาเหตุ หลายที่ ไล่ตั้งแต่ ระดับ Low Level เช่น Disk I/O ไปจนถึง ระดับ High Level เช่น Database Design และการเขียน SQL Query



สาเหตุความช้าที่พบบ่อย ๆ มีดังนี้




  1. Design Database ไม่ดี หรือดีเกินไป
    ในการออกแบบฐานข้อมูล จะมีการ Normalize Table แตกตารางเป็นหลายตาราง ให้มีความซ้ำซ้อนน้อยที่สุด เพื่อให้สะดวกต่อการ Insert, Update, Delete แต่เมื่อเราต้องการดึงข้อมูล (Select) จากตารางต่าง ๆ ขึ้นมาใช้ ทำให้ต้อง Join, Subquery หรือแม้กระทั่ง Union จากหลายตารางมากเกินไป เพื่อให้ได้ผลลัพท์ที่ต้องการ ซึ่งทำให้ช้าเกินกว่าที่รับได้ ถ้าข้อมูลมีจำนวน Record มากขึ้นเกินระดับหนึ่ง

    ในการออกแบบ Database ควร Normalize ตารางให้มีความซ้ำซ้อนน้อยที่สุด และควรคำนึงถึง การใช้งานของ User ด้วย ว่าส่วนใหญ่แล้ว User ใช้งานข้อมูลนั้น ๆ อย่างไร เช่น ใช้ทีละ 1 Record หรือทีละหลาย Record ต้องดูเปรียบเทียบหรือไม่ ข้อมูลเป็นข้อมูลที่ขึ้นกับเวลาหรือไม่ ข้อมูลอะไรใช้บ่อยใช้ไม่บ่อย ช่วงเวลาที่ใช้งานมากที่สุด ข้อมูลมีความหลายหลายหรือซ้ำกันแค่ไหน เมื่อเราเข้าใจการใช้งานของ User แล้ว ถึงจะเป็นเรื่องเทคนิคการออกแบบ เช่น การสร้าง Index, การใช้ View, Materialized View, Cost-Based Optimizer (CBO), Data Partitioning, Data Replication, Aggregation Table for Decision Support System, การใช้ค่า Null


  2. Application Tuning
    สาเหตุอันดับหนึ่งของความช้า เนื่องมากจากการเขียน SQL ไม่ถูกต้อง ทำให้เกิดการ Full Table Scan (ไล่ดูข้อมูลทั้งตารางทีละ Record ตั้งแต่ 1 ไปถึง 100), การจัดเรียงข้อมูล (Sorting) เพื่อ Matching หรือแสดงผลทุกครั้งที่ Query, Join หลาย Table เกินไป, ดึงข้อมูลมากเกินกว่าที่จะแสดงผลให้ User ดูได้ในคราวเดียว, Caching, การใช้ Like, การใช้ OR, Union, Order by, Distinct, Group by, Implicit Cast ที่ไม่เหมาะสม, ไม่ใช้ Bind Variable


  3. Memory Tuning
    ระบบจัดการฐานข้อมูล (Database Management System : DBMS) ต้องการหน่วยความจำ (Memory) ที่เพียงพอ เพื่อใช้งานการทำงานต่าง ๆ เช่น shared_pool, buffer cache, log buffer ตัวอย่างเช่นเราสามารถดูอัตรา Buffer Hit Ratio ถ้าค่ายิ่งมากยิ่งเร็ว แสดงว่าข้อมูลที่เราต้องการถูก Load อยู่บน Memory แล้วไม่ต้องไปหาจากใน Harddisk ใหม่ แต่ถ้าค่าน้อยแสดงว่า Memory น้อยเกินไป หรือมีปัญหาเรื่องการ Design อื่น ๆ ทำให้ DBMS ไม่สามารถใช้ข้อมูลที่อยู่บน Memory ได้ต้องไปดึงจาก Harddisk มาใหม่

    การตั้งค่าให้ข้อมูลบางอย่างที่ใช้บ่อยถูก Load อยู่บน Memory ตลอดเวลาตั้งแต่เริ่ม ทำให้ป้องกันปัญหาข้างต้นได้ระดับหนึ่ง


  4. I/O Tuning
    ระบบฐานข้อมูลไม่สามารถทำงานได้เร็ว ถ้าข้อมูลอยู่บน Disk ที่ช้า หรือ Network ที่ช้า และควรมีการบริหารจัดการ Data File, Log File, Temp File และ Block Size ที่เหมาะสม


  5. Eliminate Database Contention:
    ใช้ Tools ตรวจหา Lock, Latch และ Wait ภายใน Database และกำหนด Schedule Batch Job ให้ไม่กระทบกับงานขณะ Peak Working Hours.


  6. OS Tuning
    ตรวจสอบ และ Tune OS, CPU, I/O, Memory Utilization โดยประสานงานกับผู้ดูแลระบบ และศึกษาเกี่ยวกับ OS Platform ที่ใช้อยู่ เช่น Windows, Linux, Unix, Solaris

No comments: