เว็บไซต์ Oracle Management Excellence มี resource ในหลายรูปแบบ เน้นไปที่ EPM หรือ Enterprise Performance Management ซึ่งผมถือว่าเป็นการนำ business intelligence ไปใช้งานกลุ่มเฉพาะที่เน้นไปที่การเพิ่มความสามารถในการบริหาร “ผลประกอบการ” ขององค์กร

ภายในเว็บก็จะมี podcast มี presentation รวมถึงบันทึกการบรรยายทางเว็บหรือที่เรียกว่า webcast ที่เราสามารถดาวน์โหลดมาศึกษาเองได้ หรือถ้าใครสนใจ ก็สามารถสมัครเข้าฟังบรรยายสดได้ฟรี โดยลงทะเบียนผ่านทางเว็บได้เลย เนื้อหาก็ไม่ลงรายละเอียดมากนัก ไปทาง strategy, concept, case study กับ demo ความสามารถของผลิตภัณฑ์ oracle (แน่อยู่แล้ว)

ผมสังเกตว่า Oracle เริ่มปรับทิศทางด้าน BI มาชัดเจนมากขึ้น หลังจากการซื้อ Hyperion มาเมื่อปีที่แล้ัว แต่ก็ยังเห็นความเหลื่อมๆ กันอยู่บ้างระหว่างผลิตภัณฑ์ที่พัฒนามาเอง กับที่เพิ่งซื้อเข้ามา (รวมถึง Siebel Analytics/Dashboard ที่ซื้อมาก่อนหน้านี้ด้วย)

Bitmap Index เป็นอินเด็กซ์แบบหนึ่งซึ่งเริ่มมีใช้ตั้งแต่ Oracle 7.3 เป็นต้นมา โดยมีลักษณะสำคัญคือมีอัตราการบีบอัดข้อมูลที่สูงมาก ทำให้เหมาะต่อการใช้งานด้านดาต้าแวร์เฮาส์ และ OLAP มากกว่าอินเด็กซ์แบบ B-Tree ที่รู้จักกันโดยทั่วไป

ลักษณะของ Bitmap Index

Bitmap index ถูกออกแบบมาให้ใช้สำหรับคอลัมน์ที่มีลักษณะ low cardinality หรือมีค่าที่เป็นไปได้สำหรับคอลัมน์นั้นจำนวนน้อยๆ เมื่อเทียบกับจำนวนเรคอร์ดในตารางนั้น สัดส่วนจำนวนค่าที่เป็นไปได้ของคอลัมน์เทียบกับจำนวนเรคอร์ด เรียกว่า cardinality คอลัมน์ที่มี cardinality = 0.4% หมายความว่า ในตารางขนาด 1000 เรคอร์ด คอลัมน์นั้นมีค่าที่แตกต่างกัน 4 ค่า
Bitmap Index เหมาะอย่างยิ่งกับการใช้ร่วมกันคอลัมน์ที่ มี caridnality ต่ำๆ เช่น 0.2% - 1% เป็นต้น อินเด็กซ์ที่ถูกสร้างขึ้นจะประกอบด้วยบิทต่างๆ เพื่อให้แทนค่าในคอลัมน์ที่ถูกทำอินเด็กซ์ของแต่ละแถว ตัวอย่างเช่น คำสั่ง

create bitmap index person_region on person (region);

จะสร้างอินเด็กซ์ในลักษณะเช่นนี้

        Row     Region   North   East   West   South
        1       North        1      0      0       0
        2       East         0      1      0       0
        3       West         0      0      1       0
        4       West         0      0      1       0
        5       South        0      0      0       1
        6       North        1      0      0       0

ข้อดีของ Bitmap Index

  • เรียกใช้งานได้รวดเร็วกว่า ทั้งนี้เนื่องจากการทำงานจะใช้ bitwise operator หรือการจัดการข้อมูลเป็นบิท ซึ่งจะทำงานได้เร็วกว่าการเปรียบเทียบทางคณิตศาสตร์โดยทั่วไป
  • ขนาดของอินเด็กซ์เล็กกว่า B-Tree index มาก เนื่องจาก Bitmap มีลักษณะการบีบอัดที่สูงมาก ดังนั้นจึงใช้เนื้อที่ในการเก็บอินเด็กซ์เล็กด้วย bitmap index อาจจะมีขนาดเพียงแค่ 1% (1 ใน 100) เทียบกับขนาดของ B-Tree index ก็ได้ แต่อย่างไรก็ตาม การประหยัดเนื้อที่ดิสก์ไม่ควรจะเป็นเหตุผลหลักในการเลือกใช้ bitmap index เพราะยังมีผลกระทบหรือข้อควรพิจารณาอย่างอื่นด้วย

ข้อเสียของ Bitmap Index

  • Bitmap Index จะต้องใช้กำลังการประมวลผลจาก CPU สูงมากหากต้องมีการ insert หรือ update ข้อมูลในตาราง เพราะจะต้องทำการอ่านอินเด็กซ์ นำมา decompress เปลี่ยนแปลงค่าอินเด็กซ์แล้ว compress กลับไปเก็บไว้ในดิสก์อีกครั้ง ดังนั้นจึงไม่เหมาะอย่างยิ่งสำหรับตารางที่มีการเปลี่ยนแปลงข้อมูลบ่อยๆ แต่จะเหมาะสำหรับตารางที่เป็น read-only

เมื่อไหร่ควรจะใช้ Bitmap Index

แนวทางในการพิจารณาว่าควรจะใช้ Bitmap Index แทนที่ B-Tree Index หรือไม่ ประกอบด้วย

  • ตารางนั้นมีการ insert/update ข้อมูลบ่อยเพียงใด หากมีการเปลี่ยนแปลงข้อมูลบ่อยมากๆ อย่างเช่นในระบบที่ทำงานแบบ online real time ที่มีการเปลี่ยนแปลงสถานะของข้อมูลบ่อยๆ การใช้ bitmap index จะส่งผลให้เกิดภาระต่อ CPU ในการ update index สูงกว่า B-Tree Index แต่สำหรับในระบบดาต้าแวร์เฮ้าส์ที่ข้อมูลไม่มีการเปลี่ยนแปลงเลย หรือเปลี่ยนน้อยมากๆ จะเหมาะกับใช้ bitmap index มากกว่า
  • ตารางนั้นมีค่า cardinality มากน้อยเพียงใด ดังที่ได้อธิบายไว้ก่อนหน้านี้แล้ว cardinality ของตารางยิ่งต่ำ ยิ่งเหมาะที่จะทำ bitmap index หาก cardinality ของตารางมีค่าสูงกว่า 1% ก็ไม่ควรทำ bitmap index บนตารางนั้น หากคุณเคยมีประสบการณ์ในการสร้างอินเด็กซ์บน OLTP (Online-Transactional Processing) มาก่อน คงอาจจะสงสัย เพราะหลักเกณฑ์ในการสร้างอินเด็กซ์แตกต่างกัน  ในระบบ OLTP คอลัมน์ที่ควรจะสร้างอินเด็กซ์ ควรจะมี high cardinality อาทิเช่น order id, หรือ row id เป็นต้น เพราะระบบ OLTP สนับสนุนการ insert/update และ delete ข้อมูลเป็นหลัก  ในขณะที่ระบบสนับสนุนการตัดสินใจเช่นดาต้าแวร์เฮ้าส์ ซึ่งเหมาะจะใช้ bitmap index มากกว่า จะเน้นไปที่ความรวดเร็วในการเข้าถึงและเรียกค้นข้อมูล และไม่มีการเปลี่ยนแปลงข้อมูลมากนัก

หวังว่าความรู้เบื้องต้นเกี่ยวกับ bitmap index คงเป็นจุดเริ่มต้นให้ทำความเข้าใจฟีเจอร์ที่มีประโยชน์นี้ได้บ้าง  ใครเคยมีประสบการณ์ในการทำงานกับ bitmap index ก็มาเล่าสู่กันฟังบ้างนะครับ

Wal-Mart ซึ่งเป็นบริษัทค้าปลีกรายใหญ่ที่สุดในโลก เลือกใช้ระบบ Business Intelligence ของ Oracle ที่มีชื่อว่า Oracle Business Intelligence Suite Enterprise Edition Plust (OBIEE Suite Plus) เพื่อใช้ในการปฏิบัติงานทั้งหมดภายในองค์กร โดยทาง Wal-Mart วางแผนที่จะใช้ระบบนี้ในการควบคุมดูแลระบบการขนส่ง การบริหารกลุ่มสินค้า การเงิน การบริหารงานบุคคล การจัดการอสังหาริมทรัพย์ การจัดซื้อ การบริหารร้านค้า และทรัพยากรทางธุรกิจอื่นๆ

ที่มา:Wal-Mart Selects Oracle for Business Intelligence

ได้รับจดหมายเชิญเข้าร่วมงานสัมนาฟรีเกี่ยวกับเรื่อง Security จาก Oracle ใครสนใจก็ลองไปลงทะเบียนดูก่อนนะครับ

Information security today is hindered by a vast number of point solutions and features, resulting in disparate controls that add complexity and are difficult to manage. The Oracle Security Symposium will feature discussions on key trends in information security, emerging standards, and technology advancements that aim to solve this dilemma by abstracting security functionality into centralized services.

Oracle offers a complete and integrated security solution which addresses IT governance, user-centric security and data protection challenges. What’s more, Oracle helps you:

  • Reduce risk while increasing business efficiency
  • Secure your users, data, applications, and Web services with confidence
  • Comply efficiently with governance and privacy regulations
  • Streamline operations and reduce costs

Click here now to register for this FREE event. Don’t miss your exclusive opportunity to network with your peers and discuss today’s most vital information security topics with industry experts.

14 August 2008
08:30 am – 03:40 pm.

Grand Hyatt Erawan Hotel,
Grand 3 Room

(Click here for map)

นานๆ ต้องมาเขียนโค้ดเองเสียที ก็ชักขึ้นสนิมเหมือนกัน เช้านี้เริ่มต้นด้วยโจทย์ที่ว่าต้องการเขียน function บน Oracle PL/SQL ที่รับข้อมูลเป็นวันที่ แล้วส่งค่ากลับมาเป็นจำนวนสัปดาห์ในเดือนที่วันที่นั้นอยู่ ดูตัวอย่างดีกว่า

จากปฏิทินที่ว่านี้ สมมติว่าเรากำหนดให้วันเริ่มต้นของสัปดาห์เป็นวันอาทิตย์ หมายถึงว่าหนึ่งสัปดาห์มีตั้งแต่วันเสาร์จนถึงวันอาทิตย์ เพราะฉะนั้น วันนี้ (27 มีนา) ก็จะเป็นวันที่อยู่ในสัปดาห์ที่ 5 ของเดือนมีนาคม

วิธี นับ week แบบนี้มีให้เห็นอยู่เหมือนกัน แต่ที่ควรระวังก็คือ บางทีมันก็ทำให้เำกิดสัปดาห์ที่ 6 ของเดือนได้เหมือนกัน อย่างเดือนนี้ ตามนิยามข้างต้น วันที่ 30 กับ 31 จะตกอยู่ในสัปดาห์ที่ 6

ดังนั้นฟังก์ชันนี้ควรจะทำงานดังนี้

  • ใส่ค่าวันที่ 27 มีนา ส่งค่าคืนเป็น 5
  • ใส่ค่าวันที่ 31 มีนา ส่งค่าคืนเป็น 6
  • ใส่ค่าวันที่ 1 มีนา คืนค่าเป็น 1

ตอน แรกก็กะจะเขียนเอง แต่พอลองร่างคร่าวๆ สงสัยต้องเขียนเป็น loop แฮะ อย่ากระนั้นเลย มันน่าจะมีใครซักคนเคยเขียนฟังก์แบบนี้ออกมาแล้วแน่ๆ ก็เลยค้น google ด้วยคำว่า plsql counting number of weeks ก็เลยมาเจอบทความชิ้นนี้ SQL: Find the Week Number in a Month ผมยกโค้ดของเขามาอธิบายเลยก็แล้วกันนะครับ เพราะเข้าใจได้ไม่ยากเลย

เริ่ม แรกก็หาวันเริ่มต้นของเดือนก่อน โดยใช้ฟังก์ชัน trunc ซึ่งจะปัดเศษวันและเวลาตามพารามิเตอร์ที่ใส่เข้าไป ‘MM’ นี่หมายถึงปัดเศษเป็นเดือนนะครับ

SQL> select trunc(sysdate, 'MM') from dual;
TRUNC(SYS
———
01-FEB-06

แล้ว ก็ใช้ฟังก์ชัน NEXT_DAY เพื่อหาวันในสัปดาห์ถัดไป ฟังก์ชันนี้จะรับพารามิเตอร์ตัวที่สองเป็น วันของสัปดาห์ เช่น Sunday เพราะฉะนั้น select next_day(trunc(sysdate, 'MM'), 'Sunday') from dual ก็จะให้ค่าเป็น วันอาทิตย์แรกของเดือน พอนับย้อนหลังไปเจ็ดวัน ก็จะได้วันเริ่มต้นสัปดาห์แรกของเดือน

SQL > select next_day(trunc(sysdate, 'MM') - 7, 'Sunday') from dual;

NEXT_DAY(
———
29-JAN-06

จาำก จุดนี้เราก็สามารถหาได้แล้วว่าวันที่ปัจจุบัน ห่างจากวันเริ่มต้นของสัปดาห์แรกของเดือนเป็นจำนวนกี่วัน และคิดเป็นกี่สัปดาห์ได้ด้วยกันหาร 7 ปัดเศษทิ้งแล้วบวกด้วย 1 เพื่อให้เริ่มนับสัปดาห์แรกเป็นสัปดาห์ที่ 1

SQL> select sysdate - next_day(trunc(sysdate, 'MM') - 7, 'Sunday') from dual;

SYSDATE-NEXT_DAY(TRUNC(SYSDATE,’MM’)-7,’SUNDAY’)
————————————————
3.55945602

SQL> select (sysdate - next_day(trunc(sysdate, ‘MM’) - 7, ‘Sunday’))/7 from dual;

(SYSDATE-NEXT_DAY(TRUNC(SYSDATE,’MM’)-7,’SUNDAY’))/7
—————————————————-
.508627646

SQL> select trunc(((sysdate - next_day(trunc(sysdate, ‘MM’) - 7, ‘Sunday’))/7),0) + 1
from dual;

TRUNC(((SYSDATE-NEXT_DAY(TRUNC(SYSDATE,’MM’)-7,’SUNDAY’))/7),0)+1
—————————————————————–
1

ถัด จากนี้ก็เอา logic ที่ว่านี่แหละ มาเขียนเป็นฟังก์ชัน โดยกำหนด default parameter และกำหนดให้สามารถเปลี่ยนวันเริ่มต้นของสัปดาห์ได้ด้วย

CREATE OR REPLACE FUNCTION week_in_month
(check_date DATE DEFAULT sysdate, week_start CHAR DEFAULT ‘Sunday’)
RETURN number
IS
week_number NUMBER;
BEGIN
select trunc(((check_date - next_day(trunc(check_date, ‘MM’) - 7, week_start))/7),0) + 1 into week_number from dual;
RETURN week_number;
END;
/

ลองเอาไปใช้ดูนะครับ ถ้าใช้แล้วถูกใจยังไง ตามไป comment ขอบคุณคุณ Jon เจ้าของโค้ดหน่อยก็ดีนะครับ เค้าจะได้มีกำลังใจ


© 2007 BzInsight | iKon Wordpress Theme by Windows Vista Administration | Powered by Wordpress