Sql server 主桌上有几百个,小桌上有几个

Sql server 主桌上有几百个,小桌上有几个,sql-server,database,performance,database-design,Sql Server,Database,Performance,Database Design,我想知道哪种方法更适合设计数据库 我目前有一个大表(每行97列),其中引用了我可以使用的查找表 将一些列分组到较小的表中,并将它们添加到引用整行的关键列中,这对性能不是更好吗?将相关列分组到不同的表中会更好。这将提高数据库的性能以及程序员的易用性。您应该首先尝试查找列之间的所有不同关系,然后尝试将所有内容分解为表,同时记住这些关系(使用主键、分叉键、引用等)。尝试创建一个这样的图表,并从中获取它 如果将表拆分为多个部分,则需要额外的联接才能获得一行中的所有列,这将花费您的时间 97列其实并不多—

我想知道哪种方法更适合设计数据库

我目前有一个大表(每行97列),其中引用了我可以使用的查找表


将一些列分组到较小的表中,并将它们添加到引用整行的关键列中,这对性能不是更好吗?

将相关列分组到不同的表中会更好。这将提高数据库的性能以及程序员的易用性。您应该首先尝试查找列之间的所有不同关系,然后尝试将所有内容分解为表,同时记住这些关系(使用主键、分叉键、引用等)。尝试创建一个这样的图表,并从中获取它

如果将表拆分为多个部分,则需要额外的联接才能获得一行中的所有列,这将花费您的时间

97列其实并不多——我已经看过超过100列了

这完全取决于数据的使用方式—如果您的行始终只有97列,并且需要97列—那么将这些列拆分为不同的表几乎毫无意义

如果:

  • 您可以将一些“大”列(如
    XML
    VARCHAR(MAX)
    等)移动到一个单独的表中,如果您不总是需要这些列的话->在这种情况下,您的“基本”行会变小,并且基本表的性能会更好-只要您不需要那些超大的列

  • 您可以将某些列移到不总是存在的单独表中,例如,列可能是“可选”的,并且仅存在于例如20%的行中-在这种情况下,您可以为不需要这些列的其余80%的情况节省一些处理


除非数据非规范化,否则最好将所有列保留在同一个表中。SQL Server将页面从各个表读入缓冲池。因此,即使被访问的页面已经在缓冲池中,每次访问都会产生连接的成本。若每个查询只使用一个键访问几行数据,那个么索引将很好地服务于同一个表中的所有列。即使要扫描很大比例的行(>1%的大表),但只扫描97列中的少数列,也最好将这些列保留在同一个表中,因为可以使用覆盖查询的非聚集索引。但是,如果数据严重非规范化,则对其进行规范化(根据定义,根据规范化规则将其拆分为多个表以消除冗余),将大大提高性能,并且您将能够编写查询以仅访问所需的特定数据元素。

不一定!将多个“部分”连接到一行也意味着额外的连接,而这些并不是“免费的”——将表连接在一起需要花费时间@marc_是的,但是当你查询一个单元格有97列的表时,最好是有一个更小的表。此外,出于组织目的,它也更有意义。(当然取决于数据本身。。如果数据在所有97列上都相关,那么请保持这种方式,但我对此表示怀疑)@marc_s因此看来SQL Server更好地处理INT上的操作,而不是基于文本的值?@AdrianK.:数据类型越小,SQL Server处理操作越好,并且更喜欢固定长度的类型(如INT)超过可变长度,因为固定长度类型的开销较小。