ฉันมีตารางที่มีแถว 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
แก้ไข:
คำตอบที่น่าสนใจมากที่นี่แนะนำว่าสำหรับดัชนีที่มีการอ่านและการเขียนมากการสร้างใหม่อาจไม่เป็นประโยชน์ ในกรณีของฉันพื้นที่ที่ใช้เป็นข้อกังวล แต่ถ้าประสิทธิภาพการเขียนมีความสำคัญมากกว่าหนึ่งอาจดีกว่าด้วยดัชนีป้อแป้