Sql server SQL Server 2005表中有多少列过多?

Sql server SQL Server 2005表中有多少列过多?,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我请求允许动态表有1000列(由最终用户随机选择)。这对我来说似乎是个坏主意。它是一个可定制的表,所以它将有 vARARAR(200)< /> >和浮点列(浮点最好匹配应用程序C++双类型)。该数据库主要是遗留应用程序的索引,并用作报告存储库。这不是记录系统。该应用程序有数千个数据点,其中很少有数据点可以标准化 关于这对性能的影响有什么想法吗?还是一个理想的表大小来划分它呢 因为我不知道最终用户会从20k的选项中选择哪些字段,所以规范化表是不可行的。我可以将这些数据分离到几个表中,这些表需要动态

我请求允许动态表有1000列(由最终用户随机选择)。这对我来说似乎是个坏主意。它是一个可定制的表,所以它将有<代码> vARARAR(200)< /> >和<代码>浮点列(浮点最好匹配应用程序C++双类型)。该数据库主要是遗留应用程序的索引,并用作报告存储库。这不是记录系统。该应用程序有数千个数据点,其中很少有数据点可以标准化

关于这对性能的影响有什么想法吗?还是一个理想的表大小来划分它呢


因为我不知道最终用户会从20k的选项中选择哪些字段,所以规范化表是不可行的。我可以将这些数据分离到几个表中,这些表需要动态管理(可以添加或降低字段。然后删除行,重新解析记录系统以填充表)。我的首选方法是将所有20k位的数据向后推并标准化。但我不认为会发生这种情况。

通常情况下:表格越宽,性能越慢。多张薄桌子比一张大桌子好


如果你的桌子那么宽,几乎可以肯定这是一个设计问题。对于多少列更可取没有真正的规则,我在现实世界中从未真正遇到过超过20列的表。只是按关系分组。毕竟这是一个关系数据库管理系统。

似乎太多了。我首先要确保数据是标准化的。这可能是你问题的一部分。这些数据有什么用途?是报告用的吗?数据会改变吗


我认为这么宽的桌子在性能和维护方面都是噩梦。

太多了。如果列宽超过50列,则会在性能、代码维护和出现问题时进行故障排除

来自SQL2005文档:

SQLServer2005每个数据库最多可以有20亿个表,每个表可以有1024列。(…)每行的最大字节数为8060。对于具有varchar、nvarchar、varbinary或sql_variant列的表,此限制已放宽,这些列导致定义的表总宽度超过8060字节。这些列中每一列的长度仍必须在8000字节的限制范围内,但它们的组合宽度可能超过表中8060字节的限制


这些列的功能是什么?为什么不更好地将它们拆分为主表、属性(查找表)和值?

MS SQL Server每个表的列数限制为1024列,因此您将在这个边缘运行。使用varchar(200)列,您将能够超过每行8k字节的限制,因为SQL将在数据页上存储8k字节,然后将数据溢出到页面之外

SQL 2008为这样的场景添加了稀疏列—在这种场景中,会有许多列中包含空值

使用稀疏列
我觉得这个设计很糟糕

需要考虑的事项:

大多数列是否包含空值

许多将被命名为Property001、Property002、Property003等


如果是这样,我建议您重新考虑数据规范化。

这将带来巨大的性能和数据问题。它可能需要正常化

虽然SQLServer允许您创建一个每行超过8060字节的表,但它不允许您在其中存储超过8060字节的数据。您可能会意外地截断数据(更糟糕的是,直到几个月后才会发生这种情况,此时修复这个怪物既紧迫又非常困难)

质疑这一点也将是一个真正的问题。您如何知道在1000列中查找数据的哪一列?是否每个查询都需要where子句中的所有1000列

这种用户可定制的想法确实令人害怕。为什么用户需要1000个字段来定制?我见过的大多数应用程序都会给用户机会自定义一些字段,并设置一个很小的限制(通常小于10)。如果有那么多客户需要定制,那么应用程序在定义客户实际需要方面做得不够好

有时候,作为一名开发人员,你必须站起来说不,这是一个坏主意。这是其中一次

至于你应该做什么(而不是正常化),我认为我们需要更多的信息来为你指明正确的方向


顺便说一句,float是一种不精确的数据类型,不应用于正在进行计算的字段,除非您喜欢不正确的结果。

每当您需要询问系统的限制时,您都会遇到设计问题

如果您问“一个varchar可以容纳多少个字符?”那么您根本不应该使用varchar


如果您真的想知道1000列是否合适,那么您迫切需要重新组织数据。(规范化)

您是否想过作为交叉表查询的结果查看最终(1000列)表?您的原始表将只有几列,但有数千条记录


你能详细说明你的问题吗?我想没有人真正理解你为什么需要这1000列

我不同意这里的每个人……我知道这听起来很疯狂,但使用数百列的表是我做过的最好的事情

是的,许多列经常有空值; 是的,我可以将它标准化为几个表并进行转置; 是的,效率很低

然而,以无休止的不同方式分析列数据是非常快速和容易的


浪费和不雅-你永远不会建立任何有用的

我在从csv文件导入数据时看到了这一点。CSV每天从一个遗留系统中输入,有8-900列,只需将其放入一个表中即可更快