【问题标题】:Is selecting all columns from a SQL table expensive? [duplicate]从 SQL 表中选择所有列是否昂贵? [复制]
【发布时间】:2013-04-27 14:30:46
【问题描述】:

与指定要检索的列相比,从 SQL 表中选择所有列是否昂贵?

SELECT * FROM table

SELECT col1, col2, col3 FROM table

知道我正在查询的某些表有超过 100 列可能会很有用。

【问题讨论】:

  • 是的,想象一下必须读取文件中的所有列而不是仅读取几列;也在内存方面
  • 始终指定您想要的列。 EXISTSNOT EXISTS 是例外。但是,即使在那里你也可以使用EXISTS(SELECT 1... 而不是EXISTS(SELECT *...,因为前者更清晰。
  • 感谢其他线程的链接,我不敢相信我在搜索时错过了它。

标签: sql select


【解决方案1】:

可能是。这取决于表上定义了哪些索引。

如果col1,col2,col3 上存在非聚集索引,则该索引可用于满足查询(因为它比表本身更窄,无论是堆还是聚集索引),这应该会导致 I/ O 成本。

通常,它也是首选,以便您可以确定哪些查询正在使用表中的特定列。

如果表没有索引,或者只有一个聚集索引,或者没有涵盖特定查询的索引,那么无论如何都必须访问堆/聚集索引的每一页。即使那样,如果您有任何行外数据(例如较大的varchar(max)),那么如果您不将该列包含在SELECT 中,那么您可以避免那个 I/O 成本.

【讨论】:

  • +1。我还要补充一点,网络传输成本会随着数据集的大小而增长(如果它包含更少的列/字节,您的应用程序将更快地获得整个数据集),并且可能存在与存储中间结果相关的内部成本(例如排序),这可能与数据集的大小有关,也可能与数据集的大小无关,具体取决于所讨论的数据库。当然,大型数据集可能需要更多时间在应用程序端处理(直接或通过 ORM)。
  • @AllonGuralnek - 优点
【解决方案2】:

这种情况下的性能取决于查询中索引的正确使用。

如果您的数据库已正确规范化并且您在 where 子句中使用了索引,那么性能肯定会更好。

例如。

select * from tableName where id=232

这里使用索引。

您可以参考以下链接:

Performance issue in using SELECT *?

What is the reason not to use select *?

【讨论】:

  • 有用的链接,谢谢。
  • @Andreas 永远欢迎。如果它有用,那么您可以接受它作为答案。
【解决方案3】:

让我们把它分解成主要问题:

实际的数据库/应用程序:您键入查询的方式可能会改变 SQL 应用程序实际优化查询的方式、从何处获取数据等。但同样,它可能不会。在这里很难一概而论,取决于数据库应用程序和设置。

程序员资源:使用 * 代替输入内容对您来说更容易、更快捷。耶!如果命令背后的“含义”实际上是“获取所有内容”,那么使用 * 而不是手动列出所有列可能是程序员交流的一个很好的地方。当程序员事后阅读代码时,面对数百个列名的列表是一种不愉快的经历。另一方面,手动列出内容可以作为一个信号,表明您出于某种原因专门要求这些列。它不是一个强信号,但它仍然是一个信号。

其他资源/IO/内存等:现在,如果您实际上并不需要所有 100 列并且因为您很懒而查询它们,那么我们将进入更深的灰色区域。从什么数据库加载?查询结果去哪了?这些东西的读/写速度有多快?你真的想对所有列都这样做吗?执行查询将使用多少内存或资源?它会使用索引吗?它被索引了吗?在这个阶段你还需要关心优化吗?

所以总而言之,它是一个灰色地带……

【讨论】:

    【解决方案4】:

    通常,您应该只选择查询所需的列。

    有时,由于执行计划如何优化整个存储过程,选择稍后在存储过程中使用的查询的所有列不会产生任何影响。列上的索引也会产生影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      相关资源
      最近更新 更多