哪个性能更好 - 将 table 一分为二或增加列数 - Oracle
Which is better performance wise - Divide a table to two or increase the column count - Oracle
假设有一个 Oracal table,它可能有 200 列和 2000K 行。假设我必须向 table 添加一个新列。由于列数偏高(即使最大列数是 1000,我认为 200 是偏高)我可以用主键列和我的新列创建一个新的 table 或者我可以添加新的列到现有 table。哪个性能更好。这将是整体更好的设计。如果您能详细说明并引导我获取更多信息,那就更好了。提前致谢。
一般来说,创建新的 table 只是因为 'there are many columns yet' 是不明智的。额外的 table 将损害任何需要此列和其他一些列的读取或写入操作的性能。
如果 table 有 200 多列,完全重新设计它可能是有意义的。这样的table往往有几个'column groups';例如,它可能像 'if record_type = 1 we operate with columns A, B and C; if record_type = 2 we operate with columns A, D and E and so on'。如果是这样,将这些组作为单独的 table 可能会更好。一般情况是:你经常使用一个组的列,你很少应该将这些组连接在一起。
对于哪种设计会给您带来更好的性能或更普遍的更好结果这一问题,没有一个单一的答案。这在很大程度上取决于您如何使用数据。除了简单的列数和行数之外,您还需要查看数据的其他方面。是否所有列都与 table 的主键密切相关?如果不是,您可能需要仔细进行归一化过程,以便将 table 分解为几个符合更高范式的 table。
您是否熟悉各种范式,以及偏离这些范式的后果?专业设计人员有时会忽视归一化规则,但他们知道自己在做什么,并且知道不归一化的缺点。
table中表示的实体(对象)是否都属于同一类型,或者该类型是否可以拆分为多个子类型(subclasses)?如果是这样,将 table 分解为每个 class 一个 table 可能是有意义的。请参阅以下 link:
http://martinfowler.com/eaaCatalog/classTableInheritance.html
最后,也是最重要的一点,您可能在 table 设计中追求不止一个目标。除了速度之外,还有灵活性和适应性、易学性、易用性和编程性以及数据内部矛盾的自由。您必须平衡这些目标才能回答 table 应该如何组成的问题。
正如其他人所说,"It depends"。
如果大多数时候你只需要使用列的一小部分,比如有 200 列,但 90% 的时间你只使用列 1、3 和 24,而其他列是相对较少使用,然后将其分成 2 tables,其中一个 table 具有最常用的列,另一个 table 具有不常用的列,将读取经常使用的列速度更快,因为要读取的数据更少——您不必跳过所有不相关的数据。
但是如果大多数时候您使用所有 200 列,或者您以许多不同的组合使用这些列,例如一个查询使用第 1、2 和 7 列;另一个使用 1、24 和 32;另一个使用 2、7 和 32;等然后分成两个 tables 会使它变慢。如果您经常需要读取两个 table 来获取所有数据,这意味着两次单独的索引查找(或者更糟的是,两次单独的顺序搜索)。在 table 中查找记录是一项相对昂贵的操作,比跳过不需要的字段要昂贵得多。
但话虽如此:出于性能原因,我会非常谨慎地将逻辑上为一个 table 的东西分成两部分。永远不要这样做,因为你认为这可能是个问题。只有当实验或计算表明它确实是一个问题时,即当您发现在实践中性能不足或服务器负担过大时才这样做。根据预测和计算,您可能会得出这样的结论:这种针对性能的非规范化是必要的,我并不是说您必须等到服务器崩溃。但我不会非规范化,因为也许有一天它会成为一个问题。如果对您是否真的会获得净收益有任何疑问,则尤其如此。为什么要搞砸你的数据库来进行不是特别需要而且甚至可能不会实现的优化?
假设有一个 Oracal table,它可能有 200 列和 2000K 行。假设我必须向 table 添加一个新列。由于列数偏高(即使最大列数是 1000,我认为 200 是偏高)我可以用主键列和我的新列创建一个新的 table 或者我可以添加新的列到现有 table。哪个性能更好。这将是整体更好的设计。如果您能详细说明并引导我获取更多信息,那就更好了。提前致谢。
一般来说,创建新的 table 只是因为 'there are many columns yet' 是不明智的。额外的 table 将损害任何需要此列和其他一些列的读取或写入操作的性能。
如果 table 有 200 多列,完全重新设计它可能是有意义的。这样的table往往有几个'column groups';例如,它可能像 'if record_type = 1 we operate with columns A, B and C; if record_type = 2 we operate with columns A, D and E and so on'。如果是这样,将这些组作为单独的 table 可能会更好。一般情况是:你经常使用一个组的列,你很少应该将这些组连接在一起。
对于哪种设计会给您带来更好的性能或更普遍的更好结果这一问题,没有一个单一的答案。这在很大程度上取决于您如何使用数据。除了简单的列数和行数之外,您还需要查看数据的其他方面。是否所有列都与 table 的主键密切相关?如果不是,您可能需要仔细进行归一化过程,以便将 table 分解为几个符合更高范式的 table。
您是否熟悉各种范式,以及偏离这些范式的后果?专业设计人员有时会忽视归一化规则,但他们知道自己在做什么,并且知道不归一化的缺点。
table中表示的实体(对象)是否都属于同一类型,或者该类型是否可以拆分为多个子类型(subclasses)?如果是这样,将 table 分解为每个 class 一个 table 可能是有意义的。请参阅以下 link:
http://martinfowler.com/eaaCatalog/classTableInheritance.html
最后,也是最重要的一点,您可能在 table 设计中追求不止一个目标。除了速度之外,还有灵活性和适应性、易学性、易用性和编程性以及数据内部矛盾的自由。您必须平衡这些目标才能回答 table 应该如何组成的问题。
正如其他人所说,"It depends"。
如果大多数时候你只需要使用列的一小部分,比如有 200 列,但 90% 的时间你只使用列 1、3 和 24,而其他列是相对较少使用,然后将其分成 2 tables,其中一个 table 具有最常用的列,另一个 table 具有不常用的列,将读取经常使用的列速度更快,因为要读取的数据更少——您不必跳过所有不相关的数据。
但是如果大多数时候您使用所有 200 列,或者您以许多不同的组合使用这些列,例如一个查询使用第 1、2 和 7 列;另一个使用 1、24 和 32;另一个使用 2、7 和 32;等然后分成两个 tables 会使它变慢。如果您经常需要读取两个 table 来获取所有数据,这意味着两次单独的索引查找(或者更糟的是,两次单独的顺序搜索)。在 table 中查找记录是一项相对昂贵的操作,比跳过不需要的字段要昂贵得多。
但话虽如此:出于性能原因,我会非常谨慎地将逻辑上为一个 table 的东西分成两部分。永远不要这样做,因为你认为这可能是个问题。只有当实验或计算表明它确实是一个问题时,即当您发现在实践中性能不足或服务器负担过大时才这样做。根据预测和计算,您可能会得出这样的结论:这种针对性能的非规范化是必要的,我并不是说您必须等到服务器崩溃。但我不会非规范化,因为也许有一天它会成为一个问题。如果对您是否真的会获得净收益有任何疑问,则尤其如此。为什么要搞砸你的数据库来进行不是特别需要而且甚至可能不会实现的优化?