如何最有效地编写SQL

解决数据库级(SQL)工作上的问题,应该采用的是SET方法(整体的)而不是过程式的方法。下面来看看作者为什么这么说。

编写有效的SQL查询是企业软件世界中最大的难题之一。

每个公司在数据库开发项目中所面临的最根本的问题,在于开发环境中实现的性能不能在生产环境中实现。一般来说,存在性能损失是因为生产环境中的数据量要大得多。

这些问题(运行缓慢的数据库操作)可能有各种各样的原因。本文将解释如何在编写查询时进行思考,如何思考是最基本的问题,也是解决此类问题的起点。

观察发现SQL开发人员常使用过程方法编写查询。事实上,这是很自然的,因为用程序方法解决问题是最方便的人类逻辑解决方案。另一个方面,几乎所有的SQL开发人员都在同时编写Java、c#或其他编程语言的代码。Java、C#等可以用来训练开发人员以一种程序化的方式来培养他们的思维方式,因为当使用这些语言开发应用程序时,会使用很多类似的东西,比如IF .. THEN .. ELSE,FOR .. LOOP,WHILE .. DO, CASE .. WHEN。当然,在这种情况下,当将业务规则应用到一组数据时,意味着每个记录都是单独处理的(逐行处理)。这个过程方法在Java、c#等语言中使用。虽然使用语言开发软件是一种正确的方法,但在编写数据库级(SQL)的查询时,却不会产生同样的效果。

下面用两种不同的方法来解决同一个示例问题,并将结果进行比较。看看CUSTOMERS表中对应的每个客户在SALES表中有多少条记录。

过程式方法如下:

现在,采用基于SET的方法来编写查询。

可以看到在两个查询的consistent gets数量之间的差异(当检查缓冲区缓存读到的块数据时)是巨大的。使用两种不同方法编写的查询在运行时导致不同时间。这种差别可以用性能来解释。

在另一个例子中,常见的习惯是在SQL语句中调用PL/SQL函数。作为过程式工作的例子,也是一种解决问题的方法。还有其他一些影响在SQL内调用PL/SQL代码性能的不利因素,但在本文中,不会提到性能问题。

下面编写查找客户表中每个客户的购买金额的代码。

过程方法:

在第一步中,创建一个PL/SQL函数来计算每个客户的总数,然后在代码和输出中调用这个函数。

现在,采用基于SET的方法来编写查询。

在本例中,通过查看consistent GETS和递归调用输出,我们可以看到相同的情况。

我们的查询也是生成更高效的数据库操作的第一步,它考虑的是批处理,而不是逐行思考。在进行数据库操作时,批处理的方法会让你在一天结束时消耗更少的资源,从而提高工作效率。

原文发布于微信公众号 - CSDN技术头条(CSDN_Tech)

原文发表时间:2017-07-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据订阅

图数据库调研

更好,更快速的查询和分析:图数据库为查询相关数据(无论大小)提供了卓越的性能。 图模型提供了固有的索引数据结构,因此它不需要为给定条件的查询加载或接触不相关的数...

43219
来自专栏salesforce零基础学习

salesforce零基础学习(九十)项目中的零碎知识点小总结(三)

本次的内容其实大部分人都遇到过,也知道解决方案。但是因为没有牢记于心,导致问题再次出现还是花费了一点时间去排查了原因。在此记录下来,好记性不如烂笔头,争取下次发...

662
来自专栏Danny的专栏

数据库设计经验谈

一个成功的管理系统,是由:[50% 的业务 + 50% 的软件] 所组成,而 50% 的成功软件又有 [25% 的数据库 + 25% 的程序] 所组成,数据库...

1044
来自专栏微信终端开发团队的专栏

移动客户端多音字搜索

本文重点讲述微信安卓客户端在 SQLite FTS5 的基础上,多音字问题的解决方案。

1.1K21
来自专栏Hadoop数据仓库

HAWQ取代传统数仓实践(八)——维度表技术之角色扮演维度

        单个物理维度可以被事实表多次引用,每个引用连接逻辑上存在差异的角色维度。例如,事实表可以有多个日期,每个日期通过外键引用不同的日期维度,原则上每...

24210
来自专栏牛客网

奇虎360服务端开发岗面筋,自行了解一下

一面,约的10点,面试官老哥10:30左右才来,不过人还不错,没有为难我大学生,整体上面了40分钟左右: 

781
来自专栏马洪彪

Ora-03113\Ora-03114与Oracle In 拼接字符串的问题

刚深入接触Oracle不久(大学里以及刚参加工作时学到的Oracle知识只能算是皮毛),因为之前使用SqlServer有将近两年的时间,对SqlServer相对...

3746
来自专栏数据和云

性能优化:B*Tree 索引分裂之存储参数

黄玮(Fuyuncat) 黄玮(Fuyuncat),资深 Oracle DBA,从事 Oracle 数据库管理、维护与开发工作十余年,有丰富的大型数据库设计、...

2814
来自专栏编程一生

ORM规约变更经典案例---mysql军规

1214
来自专栏Java架构师历程

数据库(表结构)设计技巧及注意事项

库设计: 1、数据库名称要明确,可以加前缀或后缀的方式,使其看起来有业务含义,比如数据库名称可以为Business_DB(业务数据库)。 2、在一个企业中,...

3781

扫码关注云+社区