选择* vs选择所有列名称
问题描述:
我一直在阅读此内容,并且我明白最好明确列出列名称,但我仍然有一个问题。选择* vs选择所有列名称
让我们假设下面的情况(这是非常接近我的真实的生活场景):我没有使用任何BLOB数据
新列将永远不会被添加
我其实想要返回所有的列
- 我有一张大约有1.4亿行的表格
- 我实际上并不需要所有1.4亿行,但让我们假装我为了参数而做
- 我没有使用任何连接,也没有人会使用
- 下面的查询实际上完全是我如何运行查询。
有以下查询之间的性能差异:
select *
from table
VS
select every_column_name
from table
编辑:据我所知,在这个题目上百万的问题。但是对于这个特定的情景是否有任何性能差异?是select *
仍然不好或将两个查询具有相同的性能?
从我所知道的情况来看,基于使用explain
的结果,对于这种特殊情况没有区别。
答
这是对我评论的阐述。
使用select *
作为即席查询肯定没有坏处。这是一个很大的便利和共同点。
当您想要随时间运行相同的查询时出现问题。特别是,如果查询已编译,则对基础表的更改可能会导致意外问题。我在一个视图中“深情地”回想花费大约10个小时来调试一个问题(从早上6点开始),这个问题是由select *
引起的,当时底层表中的列类型发生了变化。该代码未重新编译,数据记录中的偏移量已关闭。
即使这种情况可以通过强制重新编译来解决。而且,我通常在临时查询中使用SELECT *
。
您的问题总结了一些关键点,如宽列减慢查询。
答
它们之间没有任何性能差异。当DBMS分析这两条语句时,它会产生相同的查询。也就是说,*是every_column_name的快捷键。
使用'select *'没有什么坏处,特别是对于临时查询。有一些风险,但你似乎理解它们,所以你可以在你的特定情况下做出最好的决定。 –