ค่า "Null" มีขนาดเท่าใดใน SQL Server


118

ฉันมีตารางขนาดใหญ่ที่มีคอลัมน์ say 10 4 คนยังคงเป็นโมฆะเกือบตลอดเวลา ฉันมีแบบสอบถามที่ใช้ค่า null โดยใช้ขนาดหรือไม่มีขนาดเป็นไบต์ ฉันอ่านบทความสองสามบทความบางบทความกล่าวว่า:

http://www.sql-server-citation.com/2009/12/common-mistakes-in-sql-server-part-4.html

มีความเข้าใจผิดว่าถ้าเรามีค่า NULL ในตารางจะไม่ใช้พื้นที่จัดเก็บ ความจริงก็คือค่า NULL ใช้พื้นที่ - 2 ไบต์

SQL: การใช้ค่า NULL เทียบกับค่าเริ่มต้น

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

คุณช่วยแนะนำฉันเกี่ยวกับขนาดที่ใช้ค่า null ได้ไหม

คำตอบ:


146

ถ้าเขตข้อมูลมีความกว้างคงที่การจัดเก็บค่า NULL จะใช้พื้นที่เท่ากับค่าอื่น ๆ นั่นคือความกว้างของเขตข้อมูล

หากฟิลด์มีความกว้างตัวแปรค่า NULL จะไม่มีช่องว่าง

นอกจากพื้นที่ที่จำเป็นในการจัดเก็บค่าว่างแล้วยังมีค่าใช้จ่ายสำหรับการมีคอลัมน์ที่เป็นโมฆะ สำหรับแต่ละแถวจะใช้หนึ่งบิตต่อคอลัมน์ที่เป็นโมฆะเพื่อทำเครื่องหมายว่าค่าสำหรับคอลัมน์นั้นเป็นโมฆะหรือไม่ นี่เป็นความจริงไม่ว่าคอลัมน์จะคงที่หรือความยาวตัวแปร


สาเหตุของความคลาดเคลื่อนที่คุณสังเกตเห็นในข้อมูลจากแหล่งอื่น:

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

  • ลิงก์ที่สองดูเหมือนจะเป็นคำถามเกี่ยวกับ Microsoft Access ฉันไม่รู้รายละเอียดว่า Access จัดเก็บ NULL ได้อย่างไร แต่ฉันจะไม่แปลกใจถ้ามันแตกต่างจาก SQL Server


1
@Mark "เป็นเรื่องจริงที่ต้องเสียค่าใช้จ่ายบางอย่างในพื้นที่จัดเก็บเพื่อทำให้คอลัมน์เป็นโมฆะ แต่เมื่อคุณทำเสร็จแล้วจะใช้พื้นที่ในการจัดเก็บค่า NULL น้อยกว่าที่จะเก็บค่า (สำหรับคอลัมน์ความกว้างของตัวแปร)" ซึ่งหมายความว่า กล่าวว่าใช้เวลา 1 บิตเป็นขนาดที่ใช้ในหน่วยความจำสำหรับประเภทข้อมูลตัวแปร
Rocky Singh

13
หน่วยความจำแอดเดรสที่เล็กที่สุดในระบบคอมพิวเตอร์ส่วนใหญ่คือหน่วยเดียวbyte(โดยทั่วไปคือ 8 บิต) ดังนั้นในความเป็นจริงbita byte. คำตอบที่ดี Mark: +1
JohnB

20
อย่างไรก็ตามบิตที่สองและบิตที่สามและจนถึงบิตที่แปดพอดีในไบต์เดียวกัน
Matti Virkkunen

1
@ มาร์ค - ใช่ว่าจะดูชัดขึ้นมาก ขออภัยสำหรับความคิดเห็นที่หายไป ฉันตั้งใจจะแก้ไข แต่การเชื่อมต่ออินเทอร์เน็ตของฉันหยุดทำงานระหว่างการลบและการส่ง! นอกจากนี้ยังขึ้นอยู่เล็กน้อย (จากส่วนความคิดเห็นที่นี่) "สำหรับระเบียนฮีปและดัชนีคลัสเตอร์จะมีบิตแมป NULL เสมอสำหรับดัชนีที่ไม่ใช่คลัสเตอร์จะไม่มีถ้าคอลัมน์ทั้งหมดในดัชนีไม่ใช่ NULL"
Martin Smith

2
@Martin Smith: ฉันไม่รู้เรื่องนั้น นั่นทำให้สิ่งต่าง ๆ ซับซ้อนมากขึ้นเพราะถ้าฉันเข้าใจอย่างถูกต้องหมายความว่าการสร้างคอลัมน์ที่เป็นโมฆะไม่ได้เพิ่มพื้นที่เก็บข้อมูลที่จำเป็น (เนื่องจากบิตแมปว่างจะปรากฏอยู่เสมอ) เว้นแต่คอลัมน์นั้นจะอยู่ในดัชนีและคอลัมน์อื่น ๆ ในดัชนีด้วย ไม่เป็นโมฆะ ในกรณีนี้ดัชนีจะต้องมีบิตแมปว่าง
Mark Byers

30

ลิงก์ต่อไปนี้อ้างว่าถ้าคอลัมน์มีความยาวตัวแปรเช่นvarcharนั้นNULLจะใช้เวลา 0 ไบต์ (บวก 1 ไบต์ใช้เพื่อตั้งค่าสถานะว่าเป็นค่าNULLหรือไม่):

ลิงก์ด้านบนและลิงก์ด้านล่างอ้างว่าสำหรับคอลัมน์ที่มีความยาวคงที่เช่นchar(10)หรือintค่าของNULLความยาวของคอลัมน์ (บวก 1 ไบต์เพื่อตั้งค่าสถานะว่าเป็นNULLหรือไม่):

ตัวอย่าง:

  1. หากคุณตั้งค่าเป็นchar(10)จะNULLใช้พื้นที่ 10 ไบต์ (ศูนย์ออก)
  2. intใช้เวลา 4 ไบต์ (ยังพุ่งออก)
  3. varchar(1 million)ชุดที่จะNULLใช้เวลา 0 ไบต์ (+ 2 bytes)

หมายเหตุ: แทนเจนต์เล็กน้อยขนาดพื้นที่จัดเก็บvarcharคือความยาวของข้อมูลที่ป้อน + 2 ไบต์


varchar ที่จัดเก็บ NULL จะใช้ไบต์ 0 + 2 + 1 (NULL เหนือศีรษะ) หรือไม่
Akash

ควรเป็น + 1 บิตเพื่อตั้งค่าสถานะเป็น NULL @Akash: ไม่จำเป็นต้องใช้ 2 ไบต์เนื่องจากบิตแมปตั้งค่าสถานะเป็น NULL อยู่แล้ว (จะไม่มีการเพิ่มข้อมูล)
Simo Kivistö

5

จากลิงค์นี้ :

แต่ละแถวมีบิตแมปว่างสำหรับคอลัมน์ที่อนุญาตให้มีค่าว่าง ถ้าแถวในคอลัมน์นั้นเป็นโมฆะบิตในบิตแมปจะเป็น 1 มิฉะนั้นจะเป็น 0

สำหรับประเภทข้อมูลขนาดตัวแปรขนาดบัญชีคือ 0 ไบต์

สำหรับประเภทข้อมูลขนาดคงที่ขนาดบัญชีคือขนาดประเภทข้อมูลเริ่มต้นเป็นไบต์ที่ตั้งค่าเป็นค่าเริ่มต้น (0 สำหรับตัวเลข '' สำหรับตัวอักษร)


คุณหมายถึงว่าสำหรับประเภทข้อมูลเช่น nvarchar (max) varchar (max) Null จะใช้เวลา 0 ไบต์และสำหรับ int, chars เป็นต้นจะใช้ขนาดเริ่มต้นเป็นค่าเริ่มต้นที่มี?
Rocky Singh

4

การจัดเก็บค่า NULL ไม่ใช้พื้นที่ใด ๆ

"ความจริงก็คือค่า NULL ใช้พื้นที่ - 2 ไบต์"

นี่เป็นความเข้าใจผิดนั่นคือ 2 ไบต์ต่อแถวและฉันค่อนข้างมั่นใจว่าทุกแถวใช้ 2 ไบต์นั้นไม่ว่าจะมีคอลัมน์ที่เป็นโมฆะหรือไม่ก็ตาม

ค่า NULL ในฐานข้อมูลคือค่าของระบบที่ใช้พื้นที่เก็บข้อมูลหนึ่งไบต์

นี่คือการพูดถึงฐานข้อมูลโดยทั่วไปไม่ใช่เฉพาะ SQL Server SQL Server ไม่ใช้ 1 ไบต์ในการจัดเก็บค่า NULL

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.