假设有一个Oracal表可能有200列和2000K行。假设我必须在表中添加一个新列。由于列数偏高(即使最大列数为1000,我认为200是高端)我可以创建一个包含主键列和新列的新表,或者我可以将新列添加到现有列中表。这将更好地表现性能。这将是整体更好的设计。如果您能够详细说明并引导我获取更多信息,那就更好了。提前谢谢。
答案 0 :(得分:4)
对于哪种设计能够为您提供更好的性能,或者更一般地说,更好的结果的问题,没有一个单一的答案。这在很大程度上取决于您如何使用数据。除了简单的列数和行数之外,还需要查看数据的各个方面。所有列是否与表的主键密切相关?如果没有,您可能需要经过仔细的规范化过程,以便将表分解为符合更高范式的几个表。
您是否熟悉各种正常形式,以及偏离这些正常形式的后果?专家设计师有时会忽视规范化规则,但他们知道自己在做什么,并且他们知道不规范化的缺点。
表中表示的实体(对象)是否都属于同一类型,或者该类型是否可以拆分为多个子类型(子类)?如果是这样,将表分解为每个类的一个表可能是有意义的。请参阅以下链接:
http://martinfowler.com/eaaCatalog/classTableInheritance.html
最后,最重要的是,您可能在表格设计中追求多个目标。除了速度之外,还具有灵活性和适应性,易于学习,易于使用和编程,以及免于内部数据的矛盾。你必须平衡这些目标,以回答你的表格应该如何组成的问题。
答案 1 :(得分:1)
通常,仅因为“有很多列”而创建新表并不明智。附加表会影响任何读取或写入操作的性能,这需要此列与其他一些列一起使用。
如果表格有200多列,那么完全重新设计它可能是有意义的。这些表通常有几个“列组”;例如,它可能像'if record_type = 1,我们使用列A,B和C操作;如果record_type = 2,我们使用列A,D和E等操作'。如果是这样,最好将这些组作为单独的表。一般条件是:您经常使用一个组的列,而您很少将这些组连接在一起。
答案 2 :(得分:1)
正如其他人所说,“这取决于”。
如果大部分时间只需要使用一小部分列,例如,如果有200列但90%的时间只使用列1,3和24,则相对使用其他列很少,然后将其分成2个表,其中一个表具有最常用的列,而另一个表具有较少使用的列,将使得经常使用的列的读取更快,因为读取的数据更少 - 您不必跳过所有不相关的数据。
但是,如果大多数时候你使用所有200列,或者你使用许多不同组合的列,就像一个查询使用第1,2和7列;另一个使用1,24和32;另一个使用2,7和32;然后分成两个表将使它变慢。如果您经常需要读取两个表来获取所有数据,这意味着两个单独的索引查找(或者更糟糕的是,两个单独的顺序搜索)。在表中查找记录是一项相对昂贵的操作,比跳过不需要的字段要贵得多。
但是所有这一切:出于性能原因,我会非常谨慎地将逻辑上的一个表分成两个。从来没有,因为你认为这可能是一个问题。只有在实验或计算表明它确实存在问题时才会这样做,也就是说,当您发现实际上性能不足或服务器负担过大时。您可能会得出结论,基于预测和计算,这种性能的非规范化是必要的,我不是说您必须等到服务器崩溃。但我不会反规范化,因为也许有一天它会成为一个问题。如果您真的获得净收益有任何疑问,尤其如此。为什么要搞砸数据库以进行不是特别需要的甚至可能无法实现的优化?