ช่วงนี้เศรษฐกิจสหรัฐกำลังระส่ำระสายหนัก จะเห็นบทความ ข้อเขียนเรื่องเกี่ยวกับการปรับตัวในช่วงวิกฤตเศรษฐกิจมากเป็นพิเศษ ในวงการไอทียังไม่เห็นผลกระทบมากนัก ส่วนหนึ่งอาจจะเป็นเพราะ สภาพการใช้จ่ายทางด้านงาน IT จะสะท้อนสภาพเศรษฐกิจตามหลังอยู่ประมาณ 1 ไตรมาส แต่ต้นปีหน้าท่าจะแย่เหมือนกัน
แน่นอนที่สภาพเศรษฐกิจโดยรวม และสภาพตลาดหุ้น จะส่งผลต่อตลาดและการเติบโตของอุตสาหกรรมด้าน Business Intelligence และ Data Warehouse แต่ส่งผลอย่างไร มากน้อยเพียงใด นาย Rick Sherman แห่ง Athena IT Solutions ก็เลยได้จัดทำ ดัชนีอุตสาหกรรมด้าน Business Intelligence/Data Warehouse (BI/DW) ขึ้น โดยอาศัยข้อมูลราคาหุ้นของบริษัทที่มีรายได้จากอุตสาหกรรม BI/DW จำนวนหนึ่งมาคำนวณเป็นดัชนี ใครสนใจว่าดัชนีที่ว่านี้คำนวณอย่างไร เอาบริษัทไหนบ้างมาเป็นฐานการคำนวณ ก็ตามไปอ่านได้จากบล็อกของเขานะครับ
Introducing the Business Intelligence (BI) & Data Warehousing (DW) Index
BI/DW Index นี่ใช้ข้อมูลจาก Google Finance มาคำนวณไว้บน Google Spreadsheet อัพเดตอัตโนมัติทุก 20 นาที ถึงแม้ว่าคงไม่อาจอ้างได้ว่า เป็นดัชนีที่สามารถสะท้อนสภาพอุตสหากรรม BI/DW ได้อย่างถูกต้องสมบูรณ์ แต่อย่างน้อยก็พอทำให้เห็นทิศทางได้เหมือนกัน
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 ก็มาเล่าสู่กันฟังบ้างนะครับ