来解决数据库级别(SQL)的工作问题应该采用SET方法(整体)而不是过程方法。来看看作者为什么这么说。编写高效的SQL查询是企业软件世界中最困难的问题之一。每个公司在数据库开发项目中面临的最根本的问题是在开发环境中实现的性能无法在生产环境中实现。一般来说,因为生产环境的数据量要大很多,所以会有性能上的损失。这些问题(缓慢的数据库操作)可能有多种原因。本文将讲解写查询时如何思考,如何思考是最基本的问题,也是解决此类问题的出发点。据观察,SQL开发人员经常使用过程方法编写查询。其实这是很自然的,因为用程序化的方法解决问题是人类逻辑最方便的解决方案。另一方面,几乎所有的SQL开发人员也在用Java、C#或其他编程语言编写代码。Java、C#等可以用来训练开发人员以过程化的方式开发他们的思维方式,因为用这些语言开发应用程序时,会用到很多类似的东西,比如IF..THEN..ELSE,FOR..循环,同时..做,案例..何时。当然,在这种情况下,当将业务规则应用于一组数据时,这意味着每个记录都被单独(逐行)处理。这种过程化方法用于Java、C#等语言。虽然使用一种语言开发软件是正确的方法,但在编写数据库级(SQL)查询时却并非如此。让我们用两种不同的方法解决同一个示例问题并比较结果。查看CUSTOMERS表中的每个客户在SALES表中有多少条记录。程序方法如下:现在,采用基于SET的方法来编写查询。可以看出,两次查询(检查buffercache读取块数据时)的consistentgets数量差异巨大。使用两种不同方法编写的查询在运行时产生不同的时间。这种差异可以用性能来解释。在另一个示例中,通常的做法是在SQL语句中调用PL/SQL函数。作为过程式工作的一个例子,它也是一种解决问题的方法。在SQL中调用PL/SQL代码还有其他一些影响性能的缺点,但在本文中,性能问题将不予提及。让我们编写代码来查找客户表中每个客户的购买金额。过程方法:第一步,创建一个PL/SQL函数来计算每个客户的总额,然后在代码和输出中调用该函数。现在,采用基于SET的方法来编写查询。通过查看一致的GETS和递归调用输出,我们可以在这种情况下看到相同的情况。我们的查询也是生成更高效的数据库操作的第一步,这些操作是分批而不是逐行思考的。在进行数据库操作时,批处理方法将使您在一天结束时消耗更少的资源,从而提高您的工作效率。
