SQL优化:一个表上有多少列?

22

最近我参与的一个项目中出现了50到126列的表格。

一个表格应该尽量少的包含列,还是将它们分离成新的表格并使用关联?这样做的优缺点是什么?


此问题之前已经被问过 - 请查看以获取更多答案 - https://dev59.com/b3RC5IYBdhLWcg3wVvct - Scott Ivey
抱歉,在我的搜索中没有找到这个。 - Jack
13个回答

25

一般来说,最好先设计表格以模拟数据需求并满足规范化的规则。然后再考虑优化,例如存储一行需要多少页等。

我同意其他人在这里发帖所说的,列数过多可能是您的表格未经适当规范化的潜在问题。但在这种情况下,它可能是可以接受的。根据你的描述,我们不能确定。

无论如何,仅因为大量列使您感到不安就将表拆分并不是正确的解决方法。这是否真正引起了任何缺陷或性能瓶颈?您需要进行测量以确保,而不是假设。


7
我发现一个好的经验法则就是看表格是否随着项目的进行而增加行数。例如,在我正在工作的项目中,最初的设计者决定将站点权限作为用户表中的列。因此,随着网站实施新功能,我们不断添加更多的列。显然,这不是最优解。更好的解决方案是有一个包含权限的表,以及用户和权限之间的连接表来分配它们。但是,对于其他更归档信息或只需缓存/最小化页面/可以有效过滤的表格,拥有一个大表格并不会对项目的维护造成太大影响。至少这是我的观点。

4
通常情况下,过多的列可能意味着规范化不当,但如果没有更多关于您需求的详细信息,很难做出判断。

4

我可以想象有时可能需要拥有这么多或更多的列。 如果需要对数据进行去规范化和缓存,或者需要处理具有许多属性的行类型,则可以使用此类例子。 我认为关键是避免使用 select * 并确保正确索引所需的列和组合。


3
如果你有一个详细描述数据库中数据的对象,你会选择一个具有120个字段的单一对象,还是寻找能够逻辑上区分的数据来提取数据?你可以将地址数据与客户数据内联,但是将其删除并放入地址表中是有意义的,即使它与人员保持1:1映射。
沿着这条路线,您可能需要记录他们以前的地址,通过拆分它,您已经解决了系统重构的一个主要问题。
是否有任何字段在多行中重复?即,客户的详细信息是否按发票每个副本复制一次?在这种情况下,应该在Customers表中有一个客户条目,在Invoices表中有n个条目。
其中一个不应该修复规范化错误的地方是事实表 (用于审计等) ,其目的是汇总数据以运行分析。然而,这些表通常是从正确规范化的表中填充的 (例如,在过夜时)。

2

听起来你可能存在潜在的规范化问题。

如果你真的想的话,可以为每个列(有点极端)或相关列组创建一个新表,并将其与每个记录的ID进行连接。


2

如果人们在代码中频繁使用"Select * from GiantTableWithManyColumns",那么这肯定会影响性能...


2
以下是SQL Server 2005的官方统计数据:http://msdn.microsoft.com/en-us/library/ms143432.aspx 请注意这些数据是最大值,不一定是可用性最好的。
考虑将126个列分成几个部分。例如,如果是某种“人员”表,则可以有以下字段:
Person ID、AddressNum、AddressSt、AptNo、Province、Country、PostalCode、Telephone、CellPhone、Fax
但你也可以将其分成以下三个表:
Person ID、AddressID、PhoneID
Address ID、AddressNum、AddressSt、AptNo、Province、Country、PostalCode Phone ID、Telephone、Cellphone、fax
在第二种方法中,您还可以通过使所有具有相同地址的人具有相同的addressID来避免数据复制,而不是重复地复制相同的文本。

0

0

SharePoint中的UserData表有201个字段,但是它是为特定目的而设计的。
在我看来,普通表不应该这么宽。

你可能可以进一步规范化。并阅读一些关于表优化的网络文章。

不了解更多情况很难说。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接