如果表中包含大量未使用/未选择的列,是否会影响性能?

时间:2012-09-26 13:30:40

标签: sql performance postgresql

背景 我有一张叫做汽车的桌子,里面装着很多二手车,大约100万行。该表有170多列。该表仅针对各列进行索引。大多数列是布尔值(例如has_automatic_gearbox等),其余列是字符串和数字(​​例如颜色和价格)。这些车在一个视图中显示,我在其中使用了总共​​170列中的大约80列。

我的问题: 所以我的问题是,它是否会对性能有所影响,无论我在搜索时是否只选择表中的80列,或者另一方面我创建了一个新表,仅包含我需要的80列,而不是总共170列?换句话说,它是否会对性能有所影响,表是否包含未被选中的列?

3 个答案:

答案 0 :(得分:6)

Andomar在评论中说“这取决于”是正确的。但是,如果你质疑是这样的话:

  

表格中的列数是否会影响选择查询?

然后答案是。它们是“额外的”还是“未使用的”是数据库设计的问题,与性能问题没有任何关系。

在所有其他条件相同的情况下,具有100列的表中的行将占用比具有10列的表中的行更多的空间。因为行会更大,所以您的服务器必须(相对)更难以在更宽的表中比在较小的表中查看相同数量的行。

在行占用更多空间的表中,页面拆分等内容也会更频繁发生。

如果您的问题是(我认为这可能更符合您的要求)

  

在所有条件相同的情况下,从包含170列的表中提取80列的选择查询比从80列的表中提取80列的查询要慢?

然后答案应该是

答案 1 :(得分:1)

您也可以阅读dba.SE上的similar question的答案:

Do the number of columns in a particular table affect the performance
of a query, when querying on a subset of that table?

简而言之:是的,因为未选择的列通常与所选列位于相同的磁盘块中,因此无论如何它们都会被读取。

答案 2 :(得分:0)

1E6汽车的大部分属性可能取决于一些隐藏因素,例如{品牌,型号,品牌,型号_版}。您可以将这些属性排除在一个单独的表中,并引用主汽车表中的该表。在最终的情况下,您的主要汽车表将仅包含属于汽车模型的特定实例的属性(例如:{number,price,build_date,buy_date,(可能)颜色}。)< / p>