【问题标题】:SELECT * - pros /cons选择 * - 优点/缺点
【发布时间】:2013-07-14 08:18:49
【问题描述】:

我总是从 SQL 专家那里听到,在 SELECT 语句中使用“*”号效率不高,最好列出所有字段名称。

但我个人认为在向表中添加新字段然后相应地更新所有存储过程时,它并不高效。

那么使用 '*' 的优缺点是什么?
谢谢。

【问题讨论】:

标签: sql select


【解决方案1】:

一般来说,使用SELECT * 不是一个好主意。

优点:

缺点:

  • 您返回的数据超出了您的需要。假设您添加了一个 VARBINARY 列,其中每行包含 200k。您只需要在 一个 位置为单个记录提供此数据 - 使用 SELECT * 您最终可以每 10 行返回 2MB 您不需要
  • 明确说明使用了哪些数据
  • 指定列意味着删除列时会出错
  • 查询处理器必须做更多工作 - 确定表中存在哪些列(感谢 @vinodadhikary
  • 您可以更轻松地找到列的使用位置
  • 如果您使用SELECT *,您将获得连接中的所有列
  • 您不能使用序号引用(尽管对列使用序号引用本身就是不好的做法)
  • 另见答案:What is the reason not to use select *?

【讨论】:

  • 为了增加缺点,查询处理器必须首先确定特定表中存在哪些列。
  • @vinodadhikary - 为什么这比验证包含所有列名的显式列列表更有效?我想它实际上可能会稍微少一些工作,因为它只需要检索所有列元数据而不是单独验证每一个。
  • @MartinSmith,必须先扩展通配符 *,然后才能验证所有字段。因此,如果select 包含一个*,它会被添加到 field_list。就性能而言,优化是最小的,但节省了额外的函数调用。我真的找不到 Oracle 版本的 MySQL 源代码(我也没有真正费心去挖掘它),但在 github 中找到了 twitter 的版本。看看https://github.com/twitter/mysql/blob/master/sql/sql_select.ccJOIN::prepare 在第 498 行和第 554 行之间以及setup_wildsql/sql_base.cc 中的第 7846 行。
【解决方案2】:

优点:

  • 当你真的需要所有的列时,写select *会更短

缺点:

  • 大多数时候,您不需要所有的列,而只需要其中的一部分。只检索您想要的内容会更有效
  • 您无法保证检索到的列的顺序(或者至少从查询中看不出来顺序),它禁止按索引(仅按名称)访问列。但名称也远非显而易见
  • 在连接多个可能具有相同名称列的表时,您可以为这些列定义别名

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 2016-07-12
    • 2011-03-17
    • 2011-01-06
    • 1970-01-01
    • 2020-12-14
    相关资源
    最近更新 更多