คอลัมน์ว่างเปล่าใช้พื้นที่ในตารางหรือไม่?


20

ฉันมีตารางที่เก็บจากข้อมูลพื้นฐานมาก เพียงแค่ชื่อและเขตข้อมูลวันที่ไม่กี่ มีเขตข้อมูลหนึ่งที่เรียกว่าความคิดเห็นซึ่งเป็น varchar (4000) ส่วนใหญ่เวลาที่เราเว้นว่างไว้ แต่บางครั้งจะป้อนข้อมูลจำนวนมากที่นี่ นี่เป็นการออกแบบที่ไม่ดีจริงเหรอ? หรือนี่เป็นเพียงเล็กน้อยที่ไม่มีประสิทธิภาพ?

ฉันจะถือว่าการสร้างตารางแยกสำหรับคอลัมน์นี้จะดีกว่า

หมายเหตุ: นี่คือ sql server 2008

ป้อนคำอธิบายรูปภาพที่นี่


ขอบคุณสำหรับความคิดเห็นของคุณทุกคน! ฉันตัดสินใจที่จะทำให้มันง่ายและเก็บคอลัมน์ไว้ในตารางและไม่ใส่ลงในตารางอื่น อย่างไรก็ตามฉันใช้คุณสมบัติ SPARSE ใน SQL 2008 ดังนั้นฟิลด์ไม่ใช้พื้นที่ใด ๆ

2
เพียงแค่อยากรู้อยากเห็น "เวลาส่วนใหญ่" คืออะไร? จำนวนแถวทั้งหมดและเปอร์เซ็นต์ที่มีค่าที่นี่ เพียงแค่สงสัยว่าคุณกำลังวางแผนที่จะทำการเปรียบเทียบพื้นที่ / ประสิทธิภาพโดยใช้SPARSEและไม่ใช้SPARSE...
Aaron Bertrand

คำตอบ:


9

สำหรับประสิทธิภาพที่คาดการณ์ได้มากขึ้น (และเพื่อหลีกเลี่ยงการมีความแปรปรวนของแถวสูงต่อหน้า) ฉันจะโน้มตัวไปเก็บข้อมูลนี้ในตารางที่เกี่ยวข้องโดยเฉพาะอย่างยิ่งถ้ามันมีเพียงจำนวนเล็กน้อยของเวลาและโดยเฉพาะอย่างยิ่ง แบบสอบถามบางส่วน แถวที่ค่านี้NULLมีส่วนทำให้เกิดช่องว่างเหนือศีรษะ แต่มีน้อยที่สุด สิ่งที่สำคัญกว่าคือหน้าเว็บหนึ่งหน้าอาจพอดีสองแถวเท่านั้นและหน้าถัดไปสามารถใส่ได้ 500 แถวซึ่งอาจส่งผลกระทบต่อสถิติได้และคุณอาจแยกออกได้ดีกว่าดังนั้นจึงจัดเก็บแยกกันและไม่ส่งผลกระทบต่อการดำเนินการทั้งหมดของคุณ ตารางหลัก


12

ใช้พื้นที่น้อยที่สุดเมื่อไม่ได้ใช้

  • หนึ่งบิตในบิตแมป NULL
  • สองไบต์สำหรับความยาว (ซึ่งจะเป็นศูนย์เมื่อ NULL)

ค่าโสหุ้ยน้อยที่สุดและการปรับให้เหมาะสมก่อนกำหนด

จนกว่าคุณจะรู้ว่าคุณมีปัญหาเพียงแค่เก็บไว้ในตารางเดียว คุณทำลาย KISS โดยแนะนำการรวมภายนอกและเพิ่มโอเวอร์เฮดในการสืบค้นข้อมูล

ดู/programming/3793022/how-to-come-to-limits-of-8060-bytes-per-row-and-000-per-vindar-nvarchar-valu/3793265#3793265ดูเพิ่มเติม


10

ฉันคิดว่าตารางแยกจะดีกว่าเพื่อปรับปรุงความหนาแน่นของหน้าและลดการกระจายตัวโดยเฉพาะถ้าคุณไม่เติมข้อมูลในฟิลด์นั้นเสมอ

  • หน้าข้อมูลมีขนาดประมาณ8000 ไบต์
  • คุณมีบางแถวที่มีขนาด 100 ไบต์และบางแถวที่มีขนาดมากกว่า 4,000 ไบต์
  • แถวยาวเหล่านั้นจะอยู่บนหน้าเว็บด้วยตัวเองและส่วนที่เหลือของหน้านั้นเป็นพื้นที่ "สูญเปล่า" ที่ฐานข้อมูลของคุณใช้ แต่อาจจะไม่เก็บข้อมูล
  • หากคุณเพิ่มข้อมูลลงในฟิลด์ที่มีความยาวสำหรับบันทึกในหน้าส่วนใหญ่เต็มรูปแบบมันน่าจะมีผลเกินหน้าและส่งผลให้ตัวชี้ไปยังหน้าพร้อมกับส่วนที่เหลือของระเบียน

หน้าว่างและตัวชี้ทั้งหมดเหล่านี้นำไปสู่ประสิทธิภาพที่ไม่ดี ทำให้ฟิลด์นั้นเป็นมาตรฐานถ้าคุณทำได้


4

คำถามนี้มีลักษณะคล้ายกันมาก: คอลัมน์ว่างพิเศษมีผลต่อขนาดของตาราง SQL หรือไม่

ดูเหมือนว่าคำตอบคือใช่มันใช้พื้นที่ แต่มีอัลกอริทึมการบีบอัดสำหรับคอลัมน์ที่มีค่า Null จำนวนมาก

เท่าที่การออกแบบฉันคิดว่าการมีตารางภายนอกเชื่อมโยงกับสิ่งนี้จะเป็นการออกแบบที่สะอาดตา การมีคอลัมน์ที่มีค่า Null บ่อย ๆ จะทำให้ผู้ใช้ฐานข้อมูลลำบากขึ้นเนื่องจากอาจใช้ค่า Null โดยไม่ตั้งใจได้หากไม่ระวัง ดังนั้นรหัสที่ใช้ฐานข้อมูลจะต้องมีการตรวจสอบข้อผิดพลาดและมันก็น่าเกลียดจากตรงนั้น


2
หากต้องการให้ชัดเจนอัลกอริทึมการบีบอัดจะใช้กับคอลัมน์เหล่านั้นที่กำหนดไว้อย่างชัดเจนSPARSEไม่ใช่เฉพาะ "คอลัมน์ที่มีค่า Null จำนวนมาก"
Aaron Bertrand

2

คุณจะสบายดี - เป็นคอลัมน์ varchar อยู่แล้วดังนั้นจึงใช้พื้นที่เมื่อมีข้อมูลเท่านั้น หากคุณมีคอลัมน์ขนาดคงที่ที่ไม่มีค่าได้จำนวนมากเช่น int คุณอาจมีปัญหาการใช้พื้นที่

เท่าที่วางไว้ในตารางอื่นฉันจะไม่รำคาญ คุณสามารถดูการใช้ varchar (สูงสุด) และตัวเลือกการเข้า / ออกของแถว อีกครั้งอาจจะคลอดก่อนกำหนด


1
การเพิ่มประสิทธิภาพก่อนวัยอันควรมักจะเป็นปัญหาจริง แต่ขึ้นอยู่กับค่าใช้จ่ายของการปรับโครงสร้างในภายหลัง หากคุณรู้ว่าวันนี้เพียง 1% ของแถวของคุณจะมีข้อมูลในคอลัมน์นี้และคุณคาดว่าตารางจะโตขึ้นเรื่อย ๆ ตามเวลาค่าที่เก็บรักษาข้อมูลนั้นในตารางปัจจุบันจะมีผลตามที่คุณคาดการณ์ไว้เท่านั้น ฉันทั้งหมดเพื่อหลีกเลี่ยงการเพิ่มประสิทธิภาพก่อนวัยอันควร แต่มีจุดเมื่อฉันชั่งน้ำหนักผลระยะยาวของการทำเช่นนั้น
Aaron Bertrand

@Aaron Bertrand เห็นด้วย ผู้คนถามคำถามเกี่ยวกับประสิทธิภาพที่นี่และเป็นเรื่องง่ายที่จะคิดว่าพวกเขาอาจมีแอพที่เป็นล้านแถวและพวกเขาจำเป็นต้องใช้อาวุธทุกชิ้นในชุดเครื่องมือและจำไว้เสมอ ในทางกลับกันบางครั้งผู้ใช้ดูเหมือนจะเป็นจุดเริ่มต้นของช่วงการเรียนรู้และมันยากที่จะขอให้พวกเขาให้เวลากับสิ่งที่น่าจะลดความสำคัญของพวกเขา นอกจากนี้ด้วย varchar (สูงสุด) คุณสามารถเลื่อนสวิตช์เพื่อเริ่มการจัดเก็บได้อย่างมีประสิทธิภาพ ฉันคิดว่าคำตอบที่แท้จริงคือ "คุณยังไม่ได้ให้ข้อมูลที่เพียงพอแก่เราเพื่อให้คำตอบที่ชัดเจน"
เคดรูส์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.