เกินขนาดฟิลด์ในการออกแบบฐานข้อมูล


11

ฉันมีบางฟิลด์สำหรับตารางของฉันที่เป็นสตริงและในขณะนี้ขนาดของฟิลด์ส่วนใหญ่มีข้อ จำกัด ของอักขระที่ค่อนข้างสูง ตัวอย่างเช่น 100 อักขระสำหรับชื่อถนน มีโทษสำหรับการใช้สนามขนาดใหญ่หรือไม่? ถ้าฉันเปลี่ยนขีด จำกัด เป็น 30 อักขระสำหรับฟิลด์นี้เช่นจะมีการเพิ่มประสิทธิภาพหรือประสิทธิภาพด้วยขนาดหรือไม่ จะมีประมาณ 50 สาขาที่อาจเป็นผู้สมัครเพื่อการหดตัว

ขอบคุณสำหรับคำแนะนำของคุณ


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

คุณควรคำนึงถึงขนาดของหน้าเดียว (8k) เนื่องจากจะส่งผลต่อประสิทธิภาพ ลองดูโพสต์นี้: stackoverflow.com/questions/2518922/…

ด้วยราคาที่ถูกของฮาร์ดไดรฟ์ฉันไม่ต้องกังวลกับประสิทธิภาพของการจัดเก็บในปัจจุบัน ดังที่ JNK กล่าวว่ามีผลกระทบต่อการจัดทำดัชนีสำหรับเขตข้อมูลที่มีขนาดใหญ่มากซึ่งเป็นสิ่งที่ควรคำนึงถึง ความเจ็บปวดของการเปลี่ยนแอพพลิเคชั่นเพราะคุณจัดสรรพื้นที่น้อยเกินไปนั้นสูงกว่าค่าใช้จ่ายเพิ่มเติมเล็กน้อยในตารางฐานข้อมูลของคุณ
Neville Kuyt

3
ฉันคิดว่าไม่สนใจที่เก็บข้อมูลเพราะราคาถูกเป็นความคิดที่ไม่ดี ทุกไบต์บนดิสก์จะต้องดึงข้อมูลและประมวลผลและส่วนที่ช้าที่สุดของการติดตั้ง SQL Server เกือบทุกครั้งคือที่จัดเก็บดิสก์ ไบต์น้อย = แบบสอบถามที่เร็วขึ้น
JNK

1
หาก 100MB ทำให้ข้อมูลน้อยลง 20% เพื่อให้พอดีกับแคชดิสก์ตัวควบคุม 512MB มันจะสำคัญมาก (ประสบการณ์ใช้เสียง)
Eric J.

คำตอบ:


16

หากคุณกำลังพูดถึงvarcharและnvarcharแล้วไม่มีมีบทลงโทษสำหรับการช่วยให้มีความยาวเขตข้อมูลที่สูงขึ้น


ข้อควรจำบางประการที่ควรคำนึงถึง:

  • มีโอเวอร์เฮด 2 ไบต์ต่อแถวสำหรับฟิลด์ความยาวผันแปร (ต่อฟิลด์) CHARหากคุณมีข้อมูลที่สั้นมากก็อาจทำให้รู้สึกมากขึ้นที่จะใช้ Varchar(2)เช่นใช้จริงระหว่าง 2-4 ไบต์ต่อแถวในขณะที่CHAR(2)ใช้ 2 เสมอ
  • ไม่สามารถทำดัชนีฟิลด์ที่ยาวมากได้ ความยาวสูงสุดสำหรับฟิลด์ทั้งหมดในชุดคีย์ดัชนีคือ 900 ไบต์
  • หากคุณอนุญาตข้อมูลมากกว่าที่คุณคาดหวังในที่สุดคุณจะได้รับผลลัพธ์ที่ไม่คาดคิด หากคุณอนุญาตให้ใช้ 100 ตัวอักษรสำหรับชื่อถนนในบางจุดข้อมูลอื่น ๆ มีแนวโน้มที่จะได้รับในฟิลด์นั้นโดยที่คุณไม่ต้องรับรู้ (เช่นที่อยู่ทั้งหมด) หากคุณมีขนาดที่เหมาะสมคุณอาจได้รับข้อผิดพลาดในการแทรกแทน
  • การอนุญาตให้แถวกว้างมากอาจนำไปสู่การแยกหน้าและการแยกส่วน หากคุณมีแถวที่ยาวกว่า 8k จะต้องแบ่งเป็นหน้าข้อมูลหลายหน้า สิ่งเหล่านี้มากมายอาจทำให้ประสิทธิภาพเสียหายได้ โดยทั่วไปตัวแคบจะมีประสิทธิภาพมากกว่า

1
คุณสามารถเพิ่มคำเตือนในสั้นลงเช่นกันเพื่อคำตอบนี้เช่นให้แน่ใจว่าคอลัมน์ที่มีขนาดใหญ่พอที่น้อย: varchar อยู่ (30) ไม่สามารถรับมือกับBolderwood สวนรุกขชาติประดับไดรฟ์หรือภาคตะวันออกเฉียงเหนือเคนตั๊กกี้อุตสาหกรรมปาร์คเวย์

@Aleksi - จริงมาก ฉันคิดว่าสิ่งเหล่านั้นชัดเจนกว่าซึ่งเป็นเหตุผลว่าทำไม OP จึงใช้ทุ่งกว้างในการเริ่มต้น
JNK

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


2

หากคุณหมายถึง "มีโทษสำหรับการประกาศขนาดของเขตข้อมูลที่ใหญ่กว่าค่าใด ๆ ที่จัดเก็บจริงหรือไม่" ถ้าเป็นเช่นนั้นจะประกาศ varchar คำตอบคือไม่ เอ็นจิน SQL DB ทุกตัวที่ฉันรู้จักเก็บเฉพาะจำนวนอักขระที่กำหนดในข้อมูลจริง (บวกค่าความยาว) ดังนั้นถ้าคุณกำหนดเขตข้อมูลเป็น varchar (100) แต่เก็บเฉพาะ 10 อักขระในนั้นก็จะใช้เวลาเพียง 10 ตัวอักษรบนดิสก์ (บวก 2 ไบต์หรือมากกว่านั้นสำหรับความยาว) เมื่อมีข้อสงสัยฉันมักจะทำให้ทุ่ง varchar ของฉันมีขนาดใหญ่อย่างน่าขัน

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

โปรดทราบว่าหากคุณให้ช่องป้อนข้อมูลขนาดใหญ่แก่ผู้ใช้ผู้ใช้จะใช้งานไม่ช้าก็เร็ว

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


2

ใครก็ตามที่อ้างว่าไม่มีบทลงโทษสำหรับการประกาศขนาดของเขตข้อมูลที่ใหญ่กว่าสิ่งที่จะถูกจัดเก็บจริงในตารางนั้นไม่ถูกต้อง ขนาดที่แท้จริงของข้อมูล (รวมทั้งค่าใช้จ่าย 2 ไบต์) เป็นสิ่งที่ได้รับการจัดเก็บจริง แต่มันเป็นคำจำกัดความของคอลัมน์ที่ใช้ในการกำหนดประมาณการเท่าที่แผนปฏิบัติการดำเนินการไป ดังนั้นในขณะที่การประกาศ varchar (1,000) เพื่อเก็บค่า 10 อักขระจะกินเนื้อที่ดิสก์ได้เพียง 12 ตัวเท่านั้นประมาณการแผนดำเนินการจะมีประสิทธิภาพน้อยกว่ามากและมีผลเสียต่อการเอียง การดำเนินการสามารถดำเนินการในหน่วยความจำเพียงอย่างเดียวหรือไม่หรือต้องใช้พื้นที่ดิสก์ชั่วคราวด้วยเช่นกัน คุณอาจสร้างคอลัมน์ varchar (1,000) แต่เครื่องมือไม่ทราบว่าค่าที่เก็บไว้ทั้งหมดของคุณน้อยกว่า varchar (10)


0

การตรวจสอบความยาวของฟิลด์เป็นสิ่งที่คุณได้รับ 'ฟรี' ซึ่งหมายความว่าคุณไม่จำเป็นต้องใช้CHECKข้อ จำกัด ในการทำเช่นเดียวกัน และคุณไม่ต้องการค่าข้อมูลที่มีขนาดใหญ่เกินไปตัวอย่างเช่นคุณต้องอัปโหลดข้อมูลของคุณไปยังฐานข้อมูลอื่นที่มีการ จำกัด องค์ประกอบข้อมูลเดียวกันถึง 35 ตัวอักษรให้สอดคล้องกับที่อยู่มาตรฐานสากล

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