gpt4 book ai didi

sql - 选择 * 与选择列

转载 作者:行者123 更新时间:2023-12-03 04:35:44 24 4
gpt4 key购买 nike

如果我只需要 2/3 列并且我查询 SELECT *不是在选择查询中提供这些列,更多/更少的 I/O 或内存是否会导致性能下降?

如果我在不需要的情况下选择 *,则可能会出现网络开销。

但是在选择操作中,数据库引擎是否始终从磁盘中提取原子元组,还是仅提取选择操作中请求的那些列?

如果它总是拉取一个元组,那么 I/O 开销是相同的。

同时,如果拉取元组,则从元组中剥离请求的列可能会消耗内存。

所以如果是这样的话,select someColumn 会比 select * 有更多的内存开销

最佳答案

有几个原因导致您永远不应该(永远)在生产代码中使用 SELECT *:

  • 由于您没有向数据库提供任何关于您想要的内容的提示,因此它首先需要检查表的定义以确定该表上的列。该查找将花费一些时间 - 在单个查询中花费的时间不多 - 但随着时间的推移它会增加

  • 如果您只需要 2/3 的列,则您选择的数据过多,需要从磁盘检索并通过网络发送 1/3

  • 如果您开始依赖数据的某些方面,例如返回的列的顺序,一旦重新组织表并添加新列(或删除现有列),您可能会得到一个令人讨厌的惊喜

  • 在 SQL Server(不确定其他数据库)中,如果您需要列的子集,那么非聚集索引总有可能满足该请求(包含所需的所有列)。使用SELECT *,您从一开始就放弃了这种可能性。在这种特殊情况下,将从索引页检索数据(如果索引页包含所有必需的列),因此与执行 相比,磁盘 I/O 内存开销会少得多SELECT *.... 查询。

是的,一开始需要多输入一点(像 SQL Server 的 SQL Prompt 这样的工具甚至可以帮助你) - 但这确实是一个没有任何异常(exception)的规则的情况:永远不要在你的代码中使用 SELECT *生产代码。 永远。

关于sql - 选择 * 与选择列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3180375/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com