ฉันมีตารางที่มีแถว 490 M และพื้นที่ตาราง 55 GB ดังนั้นประมาณ 167 ไบต์ต่อแถว ตารางมีสามคอลัมน์: กVARCHAR(100)เป็นและDATETIME2(0) SMALLINTความยาวเฉลี่ยของข้อความในVARCHARฟิลด์คือประมาณ 21.5 ดังนั้นข้อมูลดิบควรอยู่ที่ประมาณ 32 ไบต์ต่อแถว: 22 + 2 สำหรับVARCHAR, 6 สำหรับDATETIME2, และ 2 สำหรับจำนวนเต็ม 16 บิต
โปรดทราบว่าพื้นที่ด้านบนเป็นข้อมูลเท่านั้นไม่ใช่ดัชนี ฉันใช้ค่ารายงานภายใต้คุณสมบัติ | จัดเก็บข้อมูล | ทั่วไป | พื้นที่ข้อมูล
แน่นอนว่าต้องมีค่าใช้จ่ายอยู่บ้างแต่ดูเหมือนว่า 135 ไบต์ต่อแถวดูเหมือนจะเยอะมากโดยเฉพาะกับโต๊ะตัวใหญ่ เหตุใดจึงเป็นเช่นนี้ มีคนอื่นเห็นตัวคูณที่เหมือนกันหรือไม่ ปัจจัยใดที่สามารถส่งผลต่อปริมาณพื้นที่เพิ่มเติมที่ต้องการ
สำหรับการเปรียบเทียบฉันพยายามสร้างตารางที่มีสองINTฟิลด์และ 1 M แถว พื้นที่ข้อมูลที่ต้องการคือ 16.4 MB: 17 ไบต์ต่อแถวเมื่อเปรียบเทียบกับข้อมูลดิบ 8 ไบต์ ตารางทดสอบอีกอันที่มีINTและที่VARCHAR(100)มีข้อความเดียวกันกับตารางจริงใช้ 39 ไบต์ต่อแถว (44 K แถว) ซึ่งฉันคาดหวังว่า 28 บวกเล็กน้อย
ดังนั้นตารางการผลิตจึงมีค่าใช้จ่ายมากขึ้น นี่เป็นเพราะมันใหญ่กว่าหรือเปล่า ฉันคาดหวังว่าขนาดดัชนีจะประมาณ N * log (N) แต่ฉันไม่เห็นว่าทำไมพื้นที่ที่จำเป็นสำหรับข้อมูลจริงจึงไม่ใช่เชิงเส้น
ขอบคุณล่วงหน้าสำหรับพอยน์เตอร์ใด ๆ !
แก้ไข:
NOT NULLทั้งหมดของฟิลด์ที่ระบุไว้ ตารางจริงมี PK แบบคลัสเตอร์บนVARCHARฟิลด์และDATETIME2ฟิลด์ตามลำดับนั้น สำหรับการทดสอบทั้งสองข้อแรกINTคือ PK (ทำคลัสเตอร์)
หากมีความสำคัญ: ตารางคือบันทึกผลลัพธ์การ ping ฟิลด์ต่างๆคือ URL วันที่ / เวลา ping และเวลาแฝงเป็นมิลลิวินาที ข้อมูลจะถูกผนวกอย่างต่อเนื่องและไม่อัพเดท แต่ข้อมูลจะถูกลบเป็นระยะเพื่อลดข้อมูลลงเหลือเพียงไม่กี่ระเบียนต่อชั่วโมงต่อ URL
แก้ไข:
คำตอบที่น่าสนใจมากที่นี่แนะนำว่าสำหรับดัชนีที่มีการอ่านและการเขียนมากการสร้างใหม่อาจไม่เป็นประโยชน์ ในกรณีของฉันพื้นที่ที่ใช้เป็นข้อกังวล แต่ถ้าประสิทธิภาพการเขียนมีความสำคัญมากกว่าหนึ่งอาจดีกว่าด้วยดัชนีป้อแป้