评《撸一段 SQL ? 还是撸一段代码? 》
最近看到一篇博客《撸一段 SQL ? 还是撸一段代码?》,文章举例说明了一个连表查询使用程序code来写可读性可维护性更好,但是回帖意见不一致,我想作者在理论层面没有做出更好的论述,而我今天才回帖结果发现不能回帖了,于是单独写此文随记。
木桶定律
连表查询的确应该尽量避免,虽然普通情况下一条连表查询的SQL效率比两个for循环效率更高,但是我们应该知道大量依靠复杂SQL查询的应用程序,数据库很容易成为瓶颈,但应用程序所在的服务器却比较空闲,那么此时应用程序表现的结果就是等待数据库返回查询结果,总体时间更长了,这也是“木桶定律”在软件中的体现,因此,正确之道是要使得系统各个节点不要出现短板,在不使用连表查询的情况下,我们可以将表分散到不同的数据库,实现分库分表,并结合并行查询,总体上提高系统资源利用率,提高程序执行效率。
当然,上面的结论也有前提,就是每次查询的网络IO不能成为瓶颈,否则还是在数据库中执行连接操作比较合适,如果有密集的查询并且每次涉及大量IO,这种情况下甚至应该使用存储过程,所以到底是应该写在code中还是写SQL,应该具体问题具体分析。
二八原则
根据绝大部分项目实际情况,80%的查询都是一些简单的单表查询和连表查询,这部分查询用ORM是很合适的,结合缓存的确能够很大程度上提升系统效率;而剩下的20%查询涉及复杂的SQL和大量的IO,此时应该直接使用SQL或者存储过程,所以一个项目我们选择数据层框架的时候,需要它既支持ORM,也支持SQL,但应该是高级别的支持SQL,集中管理或者配置SQL的形式,类似iBatis框架那样的SQL-MAP功能。如果有大量表单,还应该考虑这样的数据层框架能够支持数据控件绑定。所以一个优秀的数据层框架应该同时具备ORM,SQL-MAP,Data Controls 功能,有一款国产的SOD框架值得推荐!
评《撸一段 SQL ? 还是撸一段代码? 》的更多相关文章
- 撸一段 SQL ? 还是撸一段代码?
记得刚入公司带我的研发哥们能写一手漂亮的 SQL,搜索准确.执行快.效率高. 配合Web项目中的查询展示数据的需求,基本是分分钟完成任务. 那段时间基本是仰视的态度,每天都去讨教一点手写 SQL 的要 ...
- 如何通过JS调用某段SQL语句
如何通过JS调用某段SQL语句,这样的需求在报表.数据平台开发中很常见.以报表平台FineReport开发为例,例如在点击某个按钮之后,来判断一下数据库条数,再决定下一步操作.那这在后台如何实现呢? ...
- FP 某段SQL语句执行时间超过1个小时,并报错:ORA-01652: 无法通过 128 (在表空间 TEMPSTG 中) 扩展
一.出现如下两个错误:1.某一段SQL语句执行时间超过1个小时:2.一个小时后,提示如下错误:ORA-01652: 无法通过 128 (在表空间 TEMPSTG 中) 扩展 temp 段ORA-065 ...
- SqlServer定时跑一段SQL语句
1.请把这段SQL语句写成一个存储过程,然后需要在B上面开启 SQL Server Agent服务,如下图: 2.开启完之后,打开数据库管理工具,然后依下图所示,展开“SQL Server Agent ...
- thinkphp5, 结合pgsql使用时, 要先运行这段sql代码
按照tp5的官方文档的说法, 必须这么做: 先执行一段sql代码 CREATE OR REPLACE FUNCTION pgsql_type(a_type varchar) RETURNS varch ...
- java.sql.BatchUpdateException: ORA-01691: Lob 段 CSASSSMBI.SYS_LOB0000076987C00003$$ 无法通过 128 (在表空间 HRDL_CSASS 中) 扩展
问题: 在tomcat日志信息中出现:java.sql.BatchUpdateException: ORA-01691: Lob 段 CSASSSMBI.SYS_LOB0000076987C00003 ...
- 9段高效率开发PHP程序的代码
php是世界上最好的语言 在php网站开发中,大家都希望能够快速的进行程序开发,如果有能直接使用的代码片段,提高开发效率,那将是起飞的感觉.今天由杭州php工程师送出福利来了,以下9段高效率开发PHP ...
- 收藏的一段关于java大数运算的代码
收藏的一段关于java大数运算的代码: package study_02.number; import java.math.BigDecimal; import java.math.BigIntege ...
- C 一个字符串有三段,第一段原样输出,第二段为要输出字符串的长度,第三段为依据第二段长度补齐第一段
C 一个字符串有三段,第一段原样输出.第二段为要输出字符串的长度,第三段为依据第二段长度补齐第一段 比如:输入abc 11 12.输出abc12121212 #include<stdio.h&g ...
随机推荐
- Android中实现APP文本内容的分享发送与接收方法简述
谨记(指定选择器Intent.createChooser()) 开始今天的内容前,先闲聊一下: (1)突然有一天头脑风暴,对很多问题有了新的看法和见解,迫不及待的想要分享给大家,文档已经写好了,我需要 ...
- git提交项目到已存在的远程分支
今天想提交项目到github的远程分支上,那个远程分支是之前就创建好的,而我的本地关联分支还没创建. 之前从未用github提交到远程分支过,弄了半个钟,看了几篇博文,终于折腾出来.现在把步骤整理 ...
- phpstorm 配置 xdebug调试工具
前言 php是脚本型程序 每次出错都要手动exit断点程序不是很方便 哪里有需求哪里就有生产,Xdebug可以实现对php的断点调试.下面将我个人的安装经历分享给大家. 运行环境 windows ...
- Windows更新清理工具 (winsxs 清理工具)
Windows 更新清理工具是一款效果非常显著的Windows7.Windows8操作系统清理优化工具!经常安装系统的朋友相比有所体会,刚刚安装完成的Win7.Win8其实占的空间并不大,去掉页面文件 ...
- 作为前端应当了解的Web缓存知识
缓存优点 通常所说的Web缓存指的是可以自动保存常见http请求副本的http设备.对于前端开发者来说,浏览器充当了重要角色.除此外常见的还有各种各样的代理服务器也可以做缓存.当Web请求到达缓存时, ...
- Leetcode 笔记 117 - Populating Next Right Pointers in Each Node II
题目链接:Populating Next Right Pointers in Each Node II | LeetCode OJ Follow up for problem "Popula ...
- 使用Nginx+Lua代理Hadoop HA
一.Hadoop HA的Web页面访问 Hadoop开启HA后,会同时存在两个Master组件提供服务,其中正在使用的组件称为Active,另一个作为备份称为Standby,例如HDFS的NameNo ...
- mybatis Generator生成代码及使用方式
本文原创,转载请注明:http://www.cnblogs.com/fengzheng/p/5889312.html 为什么要有mybatis mybatis 是一个 Java 的 ORM 框架,OR ...
- MySql中in和exists效率
mysql中的in语句是把外表和内表作hash 连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询.一直大家都认为exists比in语句的效率要高,这种说法其实是不准确的 ...
- tornado template
若果使用Tornado进行web开发可能会用到模板功能,页面继承,嵌套... 多页应用模板的处理多半依赖后端(SPA就可以动态加载局部视图),就算是RESTfull的API设计,也不妨碍同时提供部分模 ...