我面临着必须向已经有 32 列的表添加 64 个新列。举个例子:
Customers
(
CustomerID int
Name varchar(50)
Address varchar(50)
City varchar(50)
Region varchar(50)
PostalCode varchar(50)
Country varchar(2)
Telephone varchar(20)
...
NewColumn1 int null
NewColumn2 uniqueidentifier null
NewColumn3 varchar(50)
NewColumn4 varchar(50)
...
NewColumn64 datetime null
...
CreatedDate datetime
LastModifiedDate datetime
LastModifiedWorkstation varchar(50)
LastModifiedUser varchar(50)
)
大多数时候,这些新列中的大多数将包含null
.
这也是一个给定的事实if我将这 64 个新列垂直划分到一个新表中,然后每次我SELECT
来自客户:
SELECT ...
FROM Customers
必须转换为联接才能获取分区值(即有never在我不需要新列的情况下可以获得性能增益):
SELECT ...
FROM Customers
INNER JOIN Customers_ExtraColumns
ON Customers.CustomerID = Customers_ExtraColumns.CustomerID
这就是一个con划分列。
另一个con是我必须管理同时将行插入到两个表中,而不仅仅是一个表中。
决赛con我能想到的是 SQL Server 现在必须执行INNER JOIN
任何时候我想访问“顾客“。现在并且永远会浪费 CPU 和 I/O 来连接实际上是一个表的表 - 只不过我决定将它们分开。
所以我的问题是:为什么我要把它们分开?
当 64 列大部分为空时,将它们垂直划分到一个单独的表中是否有任何价值? Null 占用的空间很小......
有什么优点?
Edit:为什么我还要考虑分区?它大部分是空数据,会使表中的列数增加三倍。Surely一定很糟糕!