如果我只需要 2/3 列并且我查询SELECT *
与在选择查询中提供这些列不同,更多/更少 I/O 或内存是否会导致性能下降?
如果我在不需要的情况下选择 * ,则可能会出现网络开销。
但是在选择操作中,数据库引擎是否总是从磁盘中提取原子元组,或者只提取选择操作中请求的那些列?
如果它总是拉取一个元组,那么 I/O 开销是相同的。
同时,如果拉取元组,则从元组中剥离请求的列可能会消耗内存。
所以如果是这样的话,select someColumn 会比 select * 有更多的内存开销
有几个原因你不应该(永远)使用SELECT *
在生产代码中:
由于您没有向数据库提供任何关于您想要的内容的提示,因此它首先需要检查表的定义以确定该表上的列。该查找将花费一些时间 - 在单个查询中花费的时间不多 - 但随着时间的推移它会增加
如果您只需要 2/3 的列,那么您选择的数据过多,需要从磁盘检索并通过网络发送 1/3
如果您开始依赖数据的某些方面,例如返回的列的顺序,一旦重新组织表并添加新列(或删除现有列),您可能会得到一个令人讨厌的惊喜
在 SQL Server 中(不确定其他数据库),如果您需要列的子集,那么非聚集索引总是有可能覆盖该请求(包含所需的所有列)。与一个SELECT *
,你从一开始就放弃了这种可能性。在这种特殊情况下,将从索引页检索数据(如果索引页包含所有必需的列),从而从磁盘 I/O 中检索数据and与执行操作相比,内存开销会少得多SELECT *....
query.
是的,最初需要更多的输入(例如SQL提示 http://www.red-gate.com/products/SQL_Prompt/index.htmfor SQL Server 甚至会在这方面为您提供帮助) - 但这实际上是一种没有任何例外的规则:永远不要在生产代码中使用 SELECT * 。EVER.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)