这问题非常接近我想问的问题,但是问题和答案都更多地集中在随机行的选择上。
由于通常的规则是,"SELECT COLUMN_LIST“总是被推荐而不是"SELECT *",所以我想知道推荐是否随下面的场景而改变。
场景:从有大约5列的表中,如果我需要这5列的信息,但是在不同的步骤中,
就像在Java函数中一样,在步骤1中使用前2列,在步骤4使用第3列和第4列,在步骤10使用第5列。
有两种方法可以获取这些信息,
上述两种方法中的哪一种是推荐的?
发布于 2021-07-08 18:46:34
还有第三个选项您忘了提到,使用SELECT COLUMN_LIST进行一个DB调用。我之所以提到这一点,是因为比较何时使用SELECT *与SELECT COLUMN_LIST并不是真正的数据库调用的问题,而是模式一致性问题。
建议反对SELECT *的原因是,您从其中选择的数据集的架构可能会随着时间的推移而更改,这可能会导致意外的结果和错误,特别是对于您的应用程序来说,它总是期望Column1成为Column1,而Column3则是第三列,等等。
而且,即使将来没有任何模式更改会破坏应用程序,使用SELECT *仍然会遇到性能问题,原因有二。其中之一是,可能在数据集的末尾添加了额外的列,您现在不必要地为这些列带回额外的数据。第二个原因是,您可能会生成一个不太理想的查询计划(例如,通常可以查找的索引现在可能不适用)。
更重要的是,正如前面在注释中提到的,与使用SELECT *相比,指定列列表的代码也更简洁。这是因为它显式地通信正在使用数据库中的哪些字段,并帮助确定代码的意图,特别是对于可能无法访问数据库本身的开发人员。
还有很多其他的原因,但这些都是少数几个重要的原因。相反,在一些边缘情况下,可以使用SELECT *而不是显式列列表,您可以在我问这里的类似问题中找到其中的一些例子。
发布于 2021-07-08 18:51:22
因为你需要所有的列,做一个SELECt Col1,col3.所以很明显你需要所有的东西。
在未来的时间里,当您查看您的查询时,您需要弄清楚5年前您所做的事情,了解您选择的列是因为结构和需求的更改,而且您必须向表中添加新的列,您将需要越来越多的不必要的资源。
这取决于你正在使用的硬件,即使是Rasberry pi也有足够的资源来收集和保存所有数据,但是当设备拥有一小部分资源时,可能并不是所有的信息都能被存储,因此需要一步一步的方法。
数据库也是如此,当它在压力下不能同时处理所有数据时,您还必须一步一步地选择
总之,没有最好的方式和环境来决定这件事。
发布于 2021-07-14 16:29:20
如果您的接口允许您在散列(关联数组)中获得结果,那么当您需要所有列时,SELECT *应该是很好的。
另一个答案指出了为什么SELECT *很可能会在未来咬你。我同意他们的看法。
优化器在执行查询之前将SELECT *转换为SELECT col1, ...,因此本质上没有性能差异--如果需要所有列的话。
如果通过显式指定列,可以避免获取一些较大的TEXT或BLOB列,则可能会带来明显的性能好处。这种差异来自额外的磁盘点击率、临时表的减速和/或网络带宽。
拥有两个SELECTs的速度大约是拥有一个的两倍。但是额外的查询可能只需要一毫秒(在简单的情况下)。
https://dba.stackexchange.com/questions/295423
复制相似问题