首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >推荐方法:"SELECT *“与"SELECT COLUMN_LIST”从同一个表中选择多次

推荐方法:"SELECT *“与"SELECT COLUMN_LIST”从同一个表中选择多次
EN

Database Administration用户
提问于 2021-07-08 17:57:13
回答 3查看 1.3K关注 0票数 8

问题非常接近我想问的问题,但是问题和答案都更多地集中在随机行的选择上。

由于通常的规则是,"SELECT COLUMN_LIST“总是被推荐而不是"SELECT *",所以我想知道推荐是否随下面的场景而改变。

场景:从有大约5列的表中,如果我需要这5列的信息,但是在不同的步骤中,

就像在Java函数中一样,在步骤1中使用前2列,在步骤4使用第3列和第4列,在步骤10使用第5列。

有两种方法可以获取这些信息,

  1. 使用"SELECT *“进行1次DB调用,并按各自步骤提取所需信息。
  2. 进行多个DB调用,在步骤1、Step4和步骤10处使用"SELECT COLUMN_LIST“,在每个调用中只获取所需列的数据。

上述两种方法中的哪一种是推荐的?

EN

回答 3

Database Administration用户

回答已采纳

发布于 2021-07-08 18:46:34

还有第三个选项您忘了提到,使用SELECT COLUMN_LIST进行一个DB调用。我之所以提到这一点,是因为比较何时使用SELECT *SELECT COLUMN_LIST并不是真正的数据库调用的问题,而是模式一致性问题。

建议反对SELECT *的原因是,您从其中选择的数据集的架构可能会随着时间的推移而更改,这可能会导致意外的结果和错误,特别是对于您的应用程序来说,它总是期望Column1成为Column1,而Column3则是第三列,等等。

而且,即使将来没有任何模式更改会破坏应用程序,使用SELECT *仍然会遇到性能问题,原因有二。其中之一是,可能在数据集的末尾添加了额外的列,您现在不必要地为这些列带回额外的数据。第二个原因是,您可能会生成一个不太理想的查询计划(例如,通常可以查找的索引现在可能不适用)。

更重要的是,正如前面在注释中提到的,与使用SELECT *相比,指定列列表的代码也更简洁。这是因为它显式地通信正在使用数据库中的哪些字段,并帮助确定代码的意图,特别是对于可能无法访问数据库本身的开发人员。

还有很多其他的原因,但这些都是少数几个重要的原因。相反,在一些边缘情况下,可以使用SELECT *而不是显式列列表,您可以在我问这里的类似问题中找到其中的一些例子。

票数 18
EN

Database Administration用户

发布于 2021-07-08 18:51:22

因为你需要所有的列,做一个SELECt Col1,col3.所以很明显你需要所有的东西。

在未来的时间里,当您查看您的查询时,您需要弄清楚5年前您所做的事情,了解您选择的列是因为结构和需求的更改,而且您必须向表中添加新的列,您将需要越来越多的不必要的资源。

这取决于你正在使用的硬件,即使是Rasberry pi也有足够的资源来收集和保存所有数据,但是当设备拥有一小部分资源时,可能并不是所有的信息都能被存储,因此需要一步一步的方法。

数据库也是如此,当它在压力下不能同时处理所有数据时,您还必须一步一步地选择

总之,没有最好的方式和环境来决定这件事。

票数 3
EN

Database Administration用户

发布于 2021-07-14 16:29:20

如果您的接口允许您在散列(关联数组)中获得结果,那么当您需要所有列时,SELECT *应该是很好的。

另一个答案指出了为什么SELECT *很可能会在未来咬你。我同意他们的看法。

优化器在执行查询之前将SELECT *转换为SELECT col1, ...,因此本质上没有性能差异--如果需要所有列的话。

如果通过显式指定列,可以避免获取一些较大的TEXTBLOB列,则可能会带来明显的性能好处。这种差异来自额外的磁盘点击率、临时表的减速和/或网络带宽。

拥有两个SELECTs的速度大约是拥有一个的两倍。但是额外的查询可能只需要一毫秒(在简单的情况下)。

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/295423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档