2016-07-26 162 views
0

我一直在阅读此内容,并且我明白最好明确列出列名称,但我仍然有一个问题。选择* vs选择所有列名称

让我们假设下面的情况(这是非常接近我的真实的生活场景):我没有使用任何BLOB数据

    1. 新列将永远不会被添加

    2. 我其实想要返回所有的列

    3. 我有一张大约有1.4亿行的表格
    4. 我实际上并不需要所有1.4亿行,但让我们假装我为了参数而做
    5. 我没有使用任何连接,也没有人会使用
    6. 下面的查询实际上完全是我如何运行查询。

    有以下查询之间的性能差异:

    select * 
    from table 
    

    VS

    select every_column_name 
    from table 
    

    编辑:据我所知,在这个题目上百万的问题。但是对于这个特定的情景是否有任何性能差异?是select *仍然不好或将两个查询具有相同的性能?

    从我所知道的情况来看,基于使用explain的结果,对于这种特殊情况没有区别。

  • +1

    使用'select *'没有什么坏处,特别是对于临时查询。有一些风险,但你似乎理解它们,所以你可以在你的特定情况下做出最好的决定。 –

    回答

    2

    这是对我评论的阐述。

    使用select *作为即席查询肯定没有坏处。这是一个很大的便利和共同点。

    当您想要随时间运行相同的查询时出现问题。特别是,如果查询已编译,则对基础表的更改可能会导致意外问题。我在一个视图中“深情地”回想花费大约10个小时来调试一个问题(从早上6点开始),这个问题是由select *引起的,当时底层表中的列类型发生了变化。该代码未重新编译,数据记录中的偏移量已关闭。

    即使这种情况可以通过强制重新编译来解决。而且,我通常在临时查询中使用SELECT *

    您的问题总结了一些关键点,如宽列减慢查询。

    +0

    “代码没有重新编译,数据记录中的偏移量已关闭” - 因此在代码列索引中没有使用名称?o_O – zerkms

    +0

    @zerkms。 。 。编译代码时,列的位置将存储为偏移量和其他信息。该列的符号名称未使用。 –

    +0

    那是什么编程语言? PSQL? – zerkms

    0

    它们之间没有任何性能差异。当DBMS分析这两条语句时,它会产生相同的查询。也就是说,*是every_column_name的快捷键。