为什么是选择SELECT *
?如果添加了想要的新列,这是否意味着更少的代码更改?
我知道这SELECT COUNT(*)
在某些数据库上是性能问题,但是如果您真的想要每列,该怎么办?
确实有三个主要原因:
将数据转移到消费者方面效率低下。 当您选择SELECT *时,通常从数据库中检索到的列数超出了应用程序实际需要运行的列数。这将导致更多数据从数据库服务器移至客户端,从而减慢访问速度并增加计算机上的负载,并花费更多时间在网络上传输。当有人向原始使用者编码其数据访问权时不存在且不需要的基础表中添加新列时,尤其如此。
索引问题。 考虑一种情况,在这种情况下您希望将查询调整到较高的性能水平。如果要使用*,并且它返回的列数超出实际需要,则服务器通常必须执行比其他方式更昂贵的方法来检索数据。例如,您将无法创建仅覆盖SELECT列表中各列的索引,即使您这样做了(包括所有列[ shudder ]),下一个出现并在基础层中添加一列的人表会导致优化器忽略优化的覆盖率索引,并且您可能会发现查询的性能会由于没有显而易见的原因而大幅下降。
绑定问题。当您选择时,可以从两个不同的表中检索两个具有相同名称的列。这通常会使您的数据使用者崩溃。想象一下一个将两个表联接在一起的查询,两个表都包含一个称为“ ID”的列。消费者如何知道哪个是哪个?当基础表结构发生更改时,SELECT 还会使视图(至少在某些版本的SQL Server中)混乱(不重建视图,并且返回的数据可能是无用的)。最糟糕的是,您可以随心所欲地为列命名,但是下一个出现的家伙可能无法知道他必须担心添加会与您已经开发的列发生冲突的列名称。
但这对SELECT *并非全无好处。我将它们自由地用于以下用例:
临时查询。 尝试调试某些东西时,尤其是在我可能不熟悉的狭窄表上进行调试,SELECT *通常是我最好的朋友。它可以帮助我了解正在发生的事情,而不必进行大量有关基础列名的研究。列名称越长,它的“加号”就越大。
当表示“一行”时。 在以下用例中,SELECT 很好,并且有传言称它是性能杀手,只是城市传说,它可能已经在很多年前生效,但现在不行了:
SELECT COUNT(*) FROM table;
在这种情况下,表示“对行进行计数”。如果要使用列名代替,它将计算该列的值不为null的行。对我来说,COUNT(*)真正使您理解了对行进行计数的概念,并且避免了因从集合中消除NULL而导致的奇怪边缘情况。
这种类型的查询也是如此:
SELECT a.ID FROM TableA a
WHERE EXISTS (
SELECT *
FROM TableB b
WHERE b.ID = a.B_ID);
在任何值得盐分的数据库中,仅表示“一行”。放在子查询中的内容无关紧要。有些人在SELECT列表中使用b的ID,否则他们将使用数字1,但是IMO这些约定几乎是荒谬的。您的意思是“计算行数”,这就是的含义。那里的大多数查询优化器足够聪明地知道这一点。(尽管说实话,我只知道这对于SQL Server和Oracle是正确的。)
问题内容: 我知道这被认为是不良做法;并且,我希望整理出一份为什么要向第三方供应商提交的原因清单,说明为什么他们不应该在其分析代码的实现中使用它们。 请在下面说明您提出不良做法的理由。 问题答案: 一些较严重的问题: document.write(此后称为DW)在XHTML中不起作用 DW不会直接修改DOM,从而阻止了进一步的操作 (试图寻找证据,但充其量只是视情况而定) 页面加载完成后执行的DW
问题内容: 这是一个设计问题,未提交具体代码来保护我的底部。 使用Hibernate时,标准工作流程如下: 公开会议 开始交易 做生意(读取和修改数据) 提交交易 闭幕会议 可能会重复2-4次。 Session.clear()的合理用例是什么? 答:我遇到的具体问题是一段(大型)代码,该代码可以加载和修改实体,然后清除()会话,实质上是丢弃所做的更改。(要完成的业务任务不包括修改实体,因此代码“有
问题内容: 我问了一个一般性的Spring问题:自动播发Spring Bean,并让多个人回答说应尽可能避免调用Spring 。这是为什么? 我还应该如何访问配置了Spring创建的Bean? 我在非Web应用程序中使用Spring,并计划按照LiorH的描述访问共享对象。 修正案 我接受下面的答案,但这是Martin Fowler的另一种选择,他讨论了依赖注入与使用(本质上与调用相同)的优点。
根据我的理解,如果子例程不作用于类的实例(其作用仅限于显式输入/输出),则它是;如果子例程作用于类的实例,则它是(它可能会对实例产生副作用,使其不纯)。 关于这个话题,这里有一个很好的讨论。请注意,根据接受答案的定义,静态实际上应该是一个函数,因为实例从不隐式传递,而且它不能访问任何实例的成员。 不过,考虑到这一点,静态实际上不应该是函数吗? 我想确保我使用了正确的措辞。 有人能澄清一下吗?
我有一个问题,关于什么是正确的做法,使用SwingU实用程序的调用稍后方法。 所以首先,我想确认我理解正确。 据我所知,对GUI的更改必须在EDT上完成,因为Swing组件不是线程安全的。invokeLater方法将Runnable作为参数,该Runnable中包含的任何内容都将在EDT上运行。因此,对Swing组件的任何调用都被放入一种队列中,在EDT上一次执行一个。 有了这些,我的问题是:使用
GIL(global interpreter lock),全局解释器锁,是很多编程语言实现中都具有的特性,由于它的存在,解释器无法实现真正的并发。它也是 Python 中经常讨论的话题之一。 Python 作为编程语言存在多个具体实现,包括最常用的 CPython、超集 Cython、.NET 平台的 IronPython、JVM 上的 Jython,R 语言实现的 RPython、JIT 版本的