我有一张桌子
create table Objects (
ObjectID bigint not null primary key,
ObjectRef1 varchar(50) not null,
ObjectRef2 varchar(50) not null,
ObjectRef3 varchar(250) not null
)
所有字段都是唯一的。该表大约有 1 亿行。所有列都有唯一索引,并且经常用于查询。
哪个更快?将每个 varchar 字段规范化到单独的表中,还是保持原样?如果进行规范化,则该表将仅包含 ObjectID 列和规范化表的 ID,并且我将进行内连接以获取 ObjectRefX 的值。
对于这种规模的数据,我是否应该考虑使用 Hadoop 等其他数据库?
答案1
从您的描述来看,由于磁盘活动减少,规范化表似乎是更好的选择。 I/O 争用是大多数系统中最严重的瓶颈。 如果进行规范化,则可以减小每行的大小,并且由于 SQL Server 以页为单位从磁盘读取数据,因此行数越少,每页的行数就越多,从磁盘读取的页数就越少。
但是,如果您需要一起使用 ObjectRefX 列(即“SELECT ObjectRef1, ObjectRef2”或“WHERE ObjectRef1 = 'x' AND ObjectRef2 = 'y'”),情况就会发生变化。如果是这种情况,连接的开销可能会抵消规范化的任何好处。
回答你的另一个问题,不,对于一个组织良好的 SQL Server 数据库来说,1 亿行不是问题。许多公司的数据库都达到 TB 级,包含数十亿行。唯一的警告是,数据库越大,需要的管理就越多,才能保持其正常运行,但任何平台上的任何大型数据库都是如此。