当前位置: 首页 > 面试题库 >

不使用select *的原因是什么?

明正德
2023-03-14
问题内容

我见过很多人声称您应该在选择查询中专门为想要的每一列命名。

假设我仍然要使用所有列,为什么我不使用SELECT *

即使考虑问题* SQL查询-从视图选择或从视图*选择col1,col2,’colN,我也不认为这是完全相同的副本,因为我正从略有不同的观点着手解决这个问题。

我们的原则之一是在优化之前就不进行优化。考虑到这一点,在被证明是资源问题或架构几乎是固定的之前,似乎SELECT *应该使用 首选的
方法。众所周知,只有完成开发后,这种情况才会发生。

就是说,有一个最重要的问题不使用SELECT *吗?


问题答案:

不进行过早优化的报价的本质是编写简单明了的代码, 然后 使用探查器指出热点,然后可以对其进行优化以提高效率。

当使用select *时,将无法进行概要分析,因此,您没有在编写清晰明了的代码,这与引用的精神背道而驰。select *是反模式。

因此,选择列并不是过早的优化。我头上掉了几件事....

  1. 如果在SQL语句中指定列,则从表中删除该列并执行查询时,SQL执行引擎将出错。
  2. 您可以更轻松地在使用该列的位置扫描代码。
  3. 您应该始终编写查询以带回最少的信息量。
  4. 正如其他人提到的,如果您使用序数列访问,则永远不要使用select *
  5. 如果您的SQL语句联接了表,则选择*将为您提供联接中所有表的所有列

结果是使用select *

  1. 应用程序使用的列是不透明的
  2. DBA及其查询分析器无法帮助您降低应用程序的性能
  3. 发生更改时,代码更加脆弱
  4. 您的数据库和网络正在遭受痛苦,因为它们带来了太多的数据(I / O)
  5. 数据库引擎的优化是最小的,因为您要带回所有数据(逻辑上)。

编写正确的SQL与编写脚本一样容易Select *。因此,真正的懒惰者会编写适当的SQL,因为他们不想重新访问代码,而是想记住自己在执行操作时在做什么。他们不想向DBA解释每一段代码。他们不想向客户解释为什么应用程序像狗一样运行。



 类似资料:
  • 在哪些情况下,应该使用? 是否只是为了合法性问题? 如果是,那么问题是什么? 因为我仍然使用开发我的所有项目

  • 问题内容: 当我尝试运行程序时,出现以下错误 请帮忙 问题答案: 从Javadoc: 如果Java虚拟机找不到声明为native的方法的适当本机语言定义,则抛出该异常。 这是与JNI相关的错误。loadJacobLibrary试图加载名为jacob-1.14.3-x86的本机库,但在java.library.path定义的路径上找不到该库。启动JVM时,应将此路径定义为系统属性。例如 在Windo

  • 在这里抛出RejectedExecutionException是否有其他原因? java.util.concurrent.RejectedExecutionException:任务java.util.concurrent.FutureTask@4194a5f0被java.util.concurrent.ThreadPoolExecutor@41a36e90拒绝[终止,池大小=0,活动线程=0,排队

  • 问题内容: 上下文: 我为一整天整天攻击HTML,Javascript和CSS而 忽略 诸如jQuery( 或其他等效的辅助框架 )之类的工具而 拒绝 使用它们的前端开发人员感到惊讶。我不是在谈论JavaScript专家,而是在乔生产开发人员的日常讨论中谈论。我收到了很多像借口或个人观点的论据,但我认为这些论点没有任何技术上的优点,我想确保自己没有遗漏任何东西。 问题: 不使用jQuery的一些经

  • 问题内容: 关于Java的InterruptedException有一些有趣的问题和答案,例如Java中的InterruptedException 的原因和处理InterruptedException。但是,它们都没有告诉我InterruptedException的可能来源。 像SIGTERM,SIGQUIT,SIGINT这样的OS信号呢?在命令行上按CTRL-C是否会产生InterruptedE

  • 问题内容: 与Cipher合作时,我观察到以下内容。 加密码: 解密代码: 运行Decrypt代码时,出现IllegalBlockSizeException(输入长度​​必须为16的倍数)。 但是如果我将解密代码更改为 它工作正常。我知道这是有规律的。所以我以为是因为我没有提到填充。所以我尝试在加密过程中提供模式和填充, 加密码: 解密代码: 但是它失败,并带有IllegalBlockSizeEx