Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 向现有表中添加其他地址类型_Sql Server_Database Design_Database Schema_Database Performance_Sqlperformance - Fatal编程技术网

Sql server 向现有表中添加其他地址类型

Sql server 向现有表中添加其他地址类型,sql-server,database-design,database-schema,database-performance,sqlperformance,Sql Server,Database Design,Database Schema,Database Performance,Sqlperformance,假设我在live prod中使用此表多年: [UserContactInfo] [UserContactInfoId] uniqueidentifier not null [UserId] uniqueidentifier not null PK to [User] table [FirstName] varchar(50) null [LastName] varchar(50) null [Street] varchar(200) null [City] varchar(50) null [S

假设我在live prod中使用此表多年:

[UserContactInfo]
[UserContactInfoId] uniqueidentifier not null
[UserId] uniqueidentifier not null PK to [User] table
[FirstName] varchar(50) null
[LastName] varchar(50) null
[Street] varchar(200) null
[City] varchar(50) null
[State] varchar(2) null
[Zip] varchar(10) null
many other fields
目前,最大行字节总数仅为1K,远低于每行8K的限制

目前大约有1000万行或9GB

假设数据迁移是非常痛苦的,因为表的大小很大,需要在事务中运行所有操作,以及扩展数据库维护窗口带来的业务负面影响

现在我想添加邮寄地址

选项1:我可以添加其他列:

[MailingStreet] varchar(200) null
[MailingCity] varchar(50) null
[MailingState] varchar(2) null
[MailingZip] varchar(10) null
选项2:我可以键入地址:

[AddressType] byte not null
对应于写入时强制执行的C#枚举

enum AddressType {
Physical=1,
Mailing=2}
在db维护作业期间,运行脚本将所有现有行更新为[AddressType]=1

我的问题是,哪种选择的表现更好

备选案文1否定:

(a) 最初,所有行都将有4个未使用的列,可能即使在多年之后,实际数据行的百分比也会很低。但我相信SQLServer只需要一个位来记录col为null。 (b) 它使行稍微靠近8K边界(尽管距离此边界还有很长的距离) (c) 如果我们需要另一种地址类型,这意味着需要更多的COL

备选案文2否定:

(a) 可能在将来某个时候,该表的行数会增加一倍。我可以在
[UserId],[AddressType]
上添加一个复合索引,我确信SQL Server有各种各样的技巧来优化性能,但我是否怀疑它是否能达到表大小一半的性能


有没有人对方案1和方案2的权衡有更好的了解

选项2将是更标准的方法。这意味着您没有重复列定义(考虑一下如果您决定city需要扩展到60个字符会发生什么),并且更易于以后添加(更多地址类型)

它还为查询提供了更大的灵活性。如果有任何查询在查询时将所有地址视为“相等”(不管地址用于什么目的),那么编写就很简单,如果需要限制为特定的地址类型,可以在
WHERE
子句中应用一个简单的过滤器

与选项1相比,如果您想平等地查询所有地址,则需要在
WHERE
子句中单独命名所有地址列,并且需要小心避免混合单个元素(例如,如果您试图找到
Tampa,CO
的所有用途,您需要确保不要将邮寄地址中的城市与实际地址的状态混为一谈)。如果您希望允许用户筛选到单独的地址类型,则必须将用户界面选择转换为单独的列名,这通常会导致需要动态SQL



(根据用例的不同,您可能需要单独决定名字和姓氏,以及它们是否与地址或用户相关,以决定它们是否仍然属于此表,因为它正在模拟多个地址)

你的1a和2a点相互矛盾。1a说你不太可能有很多邮寄地址。2a说几乎每个人都有这两个地址。是哪一个?