评《撸一段 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 ...
随机推荐
- Tomcat 部署我的第一个程序
idea 生成war包.先双击clean,再双击package.生成成功之后就会产生war包. 第二步:将生成好的war文件复制到tomcat文件夹下. 第三步:配置tomcat的server.xml ...
- AngularJS 系列 学习笔记 目录篇
目录: AngularJS 系列 01 - HelloWorld和数据绑定 AngularJS 系列 02 - 模块 (持续更新)
- 使用nginx反向代理,一个80端口下,配置多个微信项目
我们要接入微信公众号平台开发,需要填写服务器配置,然后依据接口文档才能实现业务逻辑.但是微信公众号接口只支持80接口(80端口).我们因业务需求需要在一个公众号域名下面,发布两个需要微信授权的项目,怎 ...
- 在 Linux 中使用 Git 及其 和 Eclipse 的集成
##参考资料## 我是通过阅读<Pro Git>这本书学习 Git 的,我读的时候还是第一版的英文版,现在已经出第二版了,而且英文版和中文版都有.英文第二版的地址是 [https://gi ...
- [转]Java实现定时任务的三种方法
在应用里经常都有用到在后台跑定时任务的需求.举个例子,比如需要在服务后台跑一个定时任务来进行非实时计算,清除临时数据.文件等.在本文里,我会给大家介绍3种不同的实现方法: 普通thread实现 Tim ...
- 小丁带你走进git的世界二-工作区暂存区分支
小丁带你走进git的世界二-工作区暂存区分支 一.Git基本工作流程 1.初始化一个仓库 git init git clone git仓库分为两种情况: 第一种是在现有项目或目录下导入所有文件到 ...
- Bootstrap3系列:输入框组
1. 基本实例 通过在文本输入框 <input> 前面.后面或是两边加上文字或按钮,实现对表单控件的扩展. .input-group包含.input-group-addon给 .form- ...
- JavaScript权威设计--Window对象之Iframe(简要学习笔记十四)
1.Window对象属性的文档元素(id) 如果在HTML文档中用id属性来为元素命名,并且如果Window对象没有此名字的属性,Window对象会赋予一个属性,它的名字是id属性的值,而他们的值指向 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(40)-精准在线人数统计实现-【过滤器+Cache】
系列目录 上次的探讨没有任何结果,我浏览了大量的文章和个别系统的参考!决定用Cache来做,这可能有点难以接受但是配合mvc过滤器来做效果非常好! 由于之前的过滤器我们用过了OnActionExecu ...
- 使用 Ghost 写博客
今天在https://ghost.org/上试用了一会,发现这是一个出色的博客平台,相比WordPress,更轻量级,而且是使用Node.js来做的,性能也是非常的不错. 优点 轻量级 支持主题 支持 ...