ตัวเลข vs Integer สำหรับคอลัมน์ขนาดและประสิทธิภาพ


11

ฉันมีแอปพลิเคชั่นซึ่งใช้ตาราง PostgreSQL ตารางมีขนาดใหญ่มาก (พันล้านแถว) และมีคอลัมน์ซึ่งเป็นจำนวนเต็ม

integerสามารถเป็นได้ถึง 6 หลักเช่น 0-999,999 ไม่มีเชิงลบ

numeric(6,0)ฉันคิดเกี่ยวกับการเปลี่ยนให้เป็น

นี่เป็นความคิดที่ดีไหม จะnumeric(6,0)น้อยกว่าไบต์? วิธีการเกี่ยวกับประสิทธิภาพ (ตารางนี้มีการสอบถามมาก)

คำตอบ:


11

นี่เป็นความคิดที่ดีไหม

เลขที่

จะnumeric(6,0)ใช้เวลาน้อยไบต์?

เลขที่

test=> SELECT pg_column_size(INT4 '999999'), pg_column_size(NUMERIC(6,0) '999999');
 pg_column_size | pg_column_size 
----------------+----------------
              4 |             10
(1 row)

วิธีการเกี่ยวกับประสิทธิภาพ (ตารางนี้มีการสอบถามมาก)

ช้าลง มันถูกเก็บไว้เป็นเลขฐานสิบแบบไบนารีเพราะมันเป็นค่าความแม่นยำโดยพลการ


ทั้งหมดตกลงกันเป็นตัวเลขบันทึกด้านข้างมีข้อได้เปรียบอย่างหนึ่งเพราะมันบังคับให้โดเมน 0-999999 โดยอัตโนมัติ อย่างไรก็ตามสามารถแก้ไขได้ด้วยข้อ จำกัด ที่แยกต่างหากในกรณี int
Lennart

1
มีปัญหาในการเปลี่ยน numericคอลัมน์เป็นintหรือไม่?
Racer SQL

@RacerSQL ใช่ถ้าคุณมีค่าที่จะล้นขนาด int
DylanYoung

5

คำตอบที่ชัดเจนนั้นไม่ใช่คำถามของคุณทั้งหมด จำนวนเต็มเป็นวิธีที่จะไปเพื่ออะไรก็ตามที่คุณสามารถใช้ได้ (เงินเช่น)

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

การใช้จำนวนเต็มจะมีประสิทธิภาพมากกว่าตัวเลขเสมอแม้ว่าประเภทตัวเลขจะสะดวกกว่าสำหรับมนุษย์


ฉันไม่เห็นด้วยเมื่อพูดถึงเรื่องเงิน การใช้จำนวนเต็มที่ปรับขนาดเช่นการจัดเก็บ decicents (1,000 ต่อดอลลาร์) ก็โอเค แต่อึดอัดใจ NUMERICมันอย่างรวดเร็วกลายเป็นปฏิบัติในการใช้งานมากขึ้น จำนวนเต็มที่ปรับแล้วเป็นวิธีที่ดีกว่าการใช้ค่าทศนิยมสำหรับเงิน
Craig Ringer

2
@ CraigRinger ฉันไม่คิดว่าคุณจะไม่เห็นด้วยกับฉันจริงๆ! ฉันยอมรับว่าการใช้ทศนิยมเป็นเงินนั้นน้อยกว่านักพัฒนาที่น่าอึดอัดใจ แต่คำถามคือประสิทธิภาพในการค้นหาใช่ไหม การจัดการจำนวนเต็มเร็วกว่าเสมอ นอกจากนี้เมื่อเขียนแอปพลิเคชันธนาคารคุณสามารถพบกับปัญหาการปัดเศษที่ผู้คนส่วนใหญ่ไม่สนใจ แต่เป็นเรื่องสำคัญสำหรับธนาคาร ดังนั้นฉันยังเห็นด้วยกับคุณที่ไม่ใช้จุดลอยตัวเพื่อเงินเช่นกัน!
stubsthewizard

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