我在MS SQL中创建一个数据库。
对于长期数据库空间占用和性能问题有疑问。
我有一个用户表可以有不同类型的元值。
Table_User
PK UserID
Table_User_Meta
PK UserMetaID int
FK UserID int
FK CreatedBy int
CreateDate Datetime
TextValue varchar(500) NULL
DecimalValue decimal(18,0) NULL
对于不同的用法,用户可能具有不同类型的元值,因此TextValue或DecimalValue将为null。 由于TextValue最多可以为500,当有数百万行只有十进制值时会占用太多空间吗?
我想到了另一种方法。
Table_User
PK UserID
Table_User_Meta_Text
PK UserMetaTextID int
FK UserID int
FK CreatedBy int
CreateDate Datetime
MetaDescription varchar(500)
Table_User_Meta_Decimal
PK UserMetaTextID int
FK UserID int
FK CreatedBy int
CreateDate Datetime
DecimalValue decimal(18,0)
这样我使用两个单独的表,没有空字段。 但是一旦我需要检索数据,这种方式将迫使我读取两个表。
我的问题是哪种方式会更好?对于空间使用和长期性能。 Table_User中可能至少有1亿用户,每个用户最多可以有两个Meta,无论是文本还是十进制。
谢谢大家!
编辑:
解释可能重复的问题:
谢谢你们回答我的问题,我认为我的问题与此问题不一样SQL Server 2008, how much space does this occupy?
我的问题更多的是哪种方式是平衡空间占用和读/写性能的好方法。因为我从未处理过包含大量数据的数据库,所以我不确定哪种方式更适合实现。
下面的答案仍然有帮助,所以我会考虑更多的I / O性能而不是空间占用。谢谢你们。
答案 0 :(得分:0)
VARCHAR
数据类型不存储不必要的空格,
除非你指定这样的内容:ABC DEF
。所以不要
在这种情况下担心空间。BIGINT
而不是。{
decimal(18,0)
并且不要担心NULL,这可能会节省你的时间
很多空间。