3

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

我的问题: 所以我的问题是,它对性能有影响吗,是我在进行搜索时只选择表中的 80 列,还是另一方面我创建了一个只包含那些 80 列的新表我需要,而不是总共 170 列?所以换句话说,它对性能有影响吗,一个表包含未选择的列?

4

3 回答 3

8

Andomar 在“这取决于”的评论中是正确的。但是,如果您的问题是这样的:

表中的列数会影响选择查询吗?

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

在所有其他条件相同的情况下,100 列表中的一行将比 10 列表中的一行占用更多空间。因为行会更大,您的服务器将不得不(相对)更努力地在更宽的表中比在更小的表中遍历相同数量的行。

在行占用更多空间的表中,分页之类的事情也会更频繁地发生。

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

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

那么答案应该是NO

于 2012-09-26T13:44:21.357 回答
2

此外,您可能还想阅读dba.SE 上类似问题的答案:

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

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

于 2012-09-27T16:37:37.063 回答
0

您的 1E6 汽车的大部分属性可能取决于某些隐藏因素,例如 {brand,model,make,model_version}。您可以将这些属性压缩到一个单独的表中,并在您的主汽车表中引用该表。在最终情况下,您的主汽车表将仅包含属于汽车模型特定实例的属性(例如:{number, price, build_date, buy_date, (maybe) colour}。)

于 2012-09-26T14:37:12.237 回答