首页
学习
活动
专区
圈层
工具
发布

一场关于逻辑应该写在哪里的争论No.93

观察了一下,传统企业以及绝大部分转型中的企业的 Java 应用中,很神奇的是,他们的开发人员包括我自己以前,大家都非常非常希望使用一个 SQL 来完成所有的逻辑的编写,非常多企业更是把数据库的存储过程和数据库自定义函数来完成...这些关于逻辑应该写在哪里的争论从来没有停止过,不仅仅发生在后端和数据库端,连前后端都经常会发生这种争论。 为什么逻辑应该写在 SQL 中?...SQL 慢没关系,它稳定啊,慢就把机器垂直扩展一下好啦,加cpu,加内存,换SSD,加加加绝对可以解决事情的。 诸如此上,云云 为什么逻辑应该写在 Java 中?...因为一旦进行水平扩展,那么多机器的非常复杂的分布式表关联,RT 基本不是一个高并发的业务应用的能容忍的。...其实原因在上面基本描述完了,第一就是复杂 SQL 的表关联其实跟个人的能力有非常大的关系,如果一个 SQL 写得不好,那是极慢极慢的非常容易把整个数据库拖慢的。

1.6K80
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    关于构建监控系统的一点感想(四):监控系统本身应该部署在哪里?

    我们的监控是基于Prometheus构建的,然后利用grafana做可视化,都是部署在k8s里面的,这个k8s同时也是业务所在的集群,这应该也是很普遍的做法,而且网上很多教程和博客都是这么写的。...这就是上周发生的问题。 以前也发生过一件类似的事情。那时候监控系统用的是zabbix(是其他同事负责的,我只是协助,但是我了解整个事情的过程),部署在虚拟机上的。...那监控系统应该部署在哪里呢? 我个人感觉还是应该要独立部署。...而且监控系统的可用性要求也要设置的比业务系统更高,毕竟如果监控不可用的时候,那就只能等待用户来找你反馈业务系统不可用了,如果是非常关键的业务,这样的情况是不可接受的。...构建监控系统的时候,除了类似Prometheus这样开源的方案,如果使用了公有云的话,各大公有云厂商往往都有自己的监控方案,可以基于他们的监控工具做改造,比如AWS的CloudWatch等等,而且由于云厂商的监控工具使他们自己为了自家的服务开发的

    37810

    SQL养成这8个好习惯是一笔财富

    SET LNAME='YANG' WHERE EMP_ID=' VPA30890F' 这两个语句应该合并成以下一个语句 UPDATE EMPLOYEE SET FNAME='HAIWER',LNAME...五、注意临时表和表变量的用法 在复杂系统中,临时表和表变量很难避免,关于临时表和表变量的用法,需要注意: A、如果语句很复杂,连接太多,可以考虑用临时表和表变量分步完成。...E、关于临时表和表变量的选择,很多说法是表变量在内存,速度快,应该首选表变量,但是在实际使用中发现, (1)主要考虑需要放在临时表的数据量,在数据量较多的情况下,临时表的速度反而更快。...关于相关子查询,应该注意: (1) A、NOT IN、NOT EXISTS的相关子查询可以改用LEFT JOIN代替写法。...BEGIN TRAN UPDATE a SET 字段='' ROLLBACK 作业存储过程我一般会加上下面这段,这样检查错误可以放在存储过程,如果执行错误回滚操作,但是如果程序里面已经有了事务回滚,

    55210

    数据库知识学习,数据库设计优化攻略(二)

    ➢ 系统设计阶段应该归纳一些业务逻辑放在数据库编程实现,数据库编程包括数据库存储过程、触发器和函数。用数据 库编程实现业务逻辑的好处是减少网络流量并可更充分利用数据库的预编译和缓存功能。...关于索引的选择,应改主意: ➢ 根据数据量决定哪些表需要增加索引,数据量小的可以只有主键。...➢ 把经常一起出现的字段组合在一起,组成组合索引,组合索引的字段顺序与主键一样,也需要把最常用的字段放在前 面,把重复率低的字段放在前面。 ➢ 一个表不要加太多索引,因为索引影响插入和更新的速度。...➢ 纵向来看,合理写 WHERE 子句,不要写没有 WHERE 的 SQL 语句。...SET LNAME=’YANG’ WHERE EMP_ID=’ VPA30890F’ 这两个语句应该合并成以下一个语句 UPDATE EMPLOYEE SET FNAME=’HAIWER’,LNAME

    41710

    SQL好的写法

    UPDATE EMPLOYEE SET LNAME='YANG'       WHERE EMP_ID=' VPA30890F'   复制代码  这两个语句应该合并成以下一个语句 UPDATE...五、注意临时表和表变量的用法 在复杂系统中,临时表和表变量很难避免,关于临时表和表变量的用法,需要注意:   A、如果语句很复杂,连接太多,可以考虑用临时表和表变量分步完成。   ...E、关于临时表和表变量的选择,很多说法是表变量在内存,速度快,应该首选表变量,但是在实际使用中发现,   (1)主要考虑需要放在临时表的数据量,在数据量较多的情况下,临时表的速度反而更快。   ...关于相关子查询,应该注意: (1) A、NOT IN、NOT EXISTS的相关子查询可以改用LEFT JOIN代替写法。...BEGIN TRAN          UPDATE a SET 字段=''      ROLLBACK  复制代码     作业存储过程我一般会加上下面这段,这样检查错误可以放在存储过程,如果执行错误回滚操作

    1.4K20

    8个能提升工作效率的SQL好习惯

    SET LNAME='YANG' WHERE EMP_ID=' VPA30890F' 这两个语句应该合并成以下一个语句 UPDATE EMPLOYEE SET FNAME='HAIWER',LNAME...注意临时表和表变量的用法 在复杂系统中,临时表和表变量很难避免,关于临时表和表变量的用法,需要注意: A、如果语句很复杂,连接太多,可以考虑用临时表和表变量分步完成。...E、关于临时表和表变量的选择,很多说法是表变量在内存,速度快,应该首选表变量,但是在实际使用中发现, (1)主要考虑需要放在临时表的数据量,在数据量较多的情况下,临时表的速度反而更快。...关于相关子查询,应该注意: (1) A、NOT IN、NOT EXISTS的相关子查询可以改用LEFT JOIN代替写法。...BEGIN TRAN UPDATE a SET 字段='' ROLLBACK 作业存储过程我一般会加上下面这段,这样检查错误可以放在存储过程,如果执行错误回滚操作,但是如果程序里面已经有了事务回滚

    62820

    sql server之数据库语句优化

    SET LNAME='YANG' WHERE EMP_ID=' VPA30890F' 这两个语句应该合并成以下一个语句 UPDATE EMPLOYEE SET FNAME='HAIWER',LNAME=...五、注意临时表和表变量的用 在复杂系统中,临时表和表变量很难避免,关于临时表和表变量的用法,需要注意: A、如果语句很复杂,连接太多,可以考虑用临时表和表变量分步完成。...E、关于临时表和表变量的选择,很多说法是表变量在内存,速度快,应该首选表变量,但是在实际使用中发现: (1) 主要考虑需要放在临时表的数据量,在数据量较多的情况下,临时表的速度反而更快。...关于相关子查询,应该注意: (1) NOT IN、NOT EXISTS的相关子查询可以改用LEFT JOIN代替写法。...、在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数。

    1.9K70

    理解SQL原理SQL调优你必须知道的10条铁律

    SET LNAME='YANG' WHERE EMP_ID=' VPA30890F' 这两个语句应该合并成以下一个语句 UPDATE EMPLOYEE SET FNAME='HAIWER',LNAME...注意临时表和表变量的用法 在复杂系统中,临时表和表变量很难避免,关于临时表和表变量的用法,需要注意: 如果语句很复杂,连接太多,可以考虑用临时表和表变量分步完成。...关于临时表和表变量的选择,很多说法是表变量在内存,速度快,应该首选表变量,但是在实际使用中发现,主要考虑需要放在临时表的数据量,在数据量较多的情况下,临时表的速度反而更快。...关于相关子查询,应该注意: NOT IN、NOT EXISTS的相关子查询可以改用LEFT JOIN代替写法。...BEGIN TRAN UPDATE a SET 字段='' ROLLBACK 作业存储过程我一般会加上下面这段,这样检查错误可以放在存储过程,如果执行错误回滚操作,但是如果程序里面已经有了事务回滚

    1.6K50

    SQL养成这8个好习惯是一笔财富

    SET LNAME='YANG' WHERE EMP_ID=' VPA30890F' 这两个语句应该合并成以下一个语句 UPDATE EMPLOYEE SET FNAME='HAIWER',LNAME...5、注意临时表和表变量的用法 在复杂系统中,临时表和表变量很难避免,关于临时表和表变量的用法,需要注意: A、如果语句很复杂,连接太多,可以考虑用临时表和表变量分步完成。...E、关于临时表和表变量的选择,很多说法是表变量在内存,速度快,应该首选表变量,但是在实际使用中发现: 主要考虑需要放在临时表的数据量,在数据量较多的情况下,临时表的速度反而更快。...关于相关子查询,应该注意: A、NOT IN、NOT EXISTS的相关子查询可以改用LEFT JOIN代替写法。...,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数 B、注意UNION和UNION ALL的区别。

    1K10

    SQL Server优化之SQL语句优化

    SET LNAME='YANG' WHERE EMP_ID=' VPA30890F' 这两个语句应该合并成以下一个语句 UPDATE EMPLOYEE SET FNAME='HAIWER',LNAME=...五、注意临时表和表变量的用 在复杂系统中,临时表和表变量很难避免,关于临时表和表变量的用法,需要注意: A、如果语句很复杂,连接太多,可以考虑用临时表和表变量分步完成。...E、关于临时表和表变量的选择,很多说法是表变量在内存,速度快,应该首选表变量,但是在实际使用中发现: (1) 主要考虑需要放在临时表的数据量,在数据量较多的情况下,临时表的速度反而更快。...关于相关子查询,应该注意: (1) NOT IN、NOT EXISTS的相关子查询可以改用LEFT JOIN代替写法。...BEGINTRAN UPDATE a SET 字段=” ROLLBACK 作业存储过程我一般会加上下面这段,这样检查错误可以放在存储过程,如果执行错误回滚操作,但是如果程序里面已经有了事务回滚,那么存储过程就不要写事务了

    4.1K34

    步步深入:MySQL 架构总览->查询执行流程->SQL 解析顺序

    一直是想知道一条 SQL 语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了。...不过一看还是很自然和谐的,从哪里获取,不断的过滤条件,要选择一样或不一样的,排好序,那才知道要取前几条呢。...(0.00 sec) 下面从网上找到一张很形象的关于SQL JOINS的解释图,如若侵犯了你的权益,请劳烦告知删除,谢谢。...「应用」: 对主表的过滤应该放在 WHERE; 对于关联表,先条件查询后连接则用 ON,先连接后条件查询则用 WHERE。...如果在查询中指定了 DISTINCT 子句,则会创建一张内存临时表(如果内存放不下,就需要存放在硬盘了)。

    1.6K30

    步步深入:MySQL架构总览->查询执行流程->SQL解析顺序

    不过一看还是很自然和谐的,从哪里获取,不断的过滤条件,要选择一样或不一样的,排好序,那才知道要取前几条呢。...(0.00 sec) 下面从网上找到一张很形象的关于‘SQL JOINS'的解释图,如若侵犯了你的权益,请劳烦告知删除,谢谢。...; 应用: 对主表的过滤应该放在WHERE; 对于关联表,先条件查询后连接则用ON,先连接后条件查询则用WHERE; mysql> SELECT -> * -> FROM...HAVING 这个子句对VT3表中的不同的组进行过滤,只作用于分组后的数据,满足HAVING条件的子句被加入到VT4表中。...子句,则会创建一张内存临时表(如果内存放不下,就需要存放在硬盘了)。

    97210

    MySQL慢查询及解决方案

    4.2 SQL语句优化 1) 查询语句应该尽量避免全表扫描,首先应该考虑在Where子句以及OrderBy子句上建立索引,但是每一条SQL语句最多只会走一条索引,而建立过多的索引会带来插入和更新时的开销...,同时对于区分度不大的字段,应该尽量避免建立索引,可以在查询语句前使用explain关键字,查看SQL语句的执行计划,判断该查询语句是否使用了索引; 2)应尽量使用EXIST和NOT EXIST代替 IN...语句中尽量 避免使用“*”,因为在SQL语句在解析的过程中,会将“”转换成所有列的列名,而这个工作是通过查询数据字典完成的,有一定的开销; 11)Where子句中,表连接条件应该写在其他条件之前,因为Where...子句的解析是从后向前的,所以尽量把能够过滤到多数记录的限制条件放在Where子句的末尾; 12)若数据库表上存在诸如index(a,b,c)之类的联合索引,则Where子句中条件字段的出现顺序应该与索引字段的出现顺序一致...,否则将无法使用该联合索引; 13)From子句中表的出现顺序同样会对SQL语句的执行性能造成影响,From子句在解析时是从后向前的,即写在末尾的表将被优先处理,应该选择记录较少的表作为基表放在后面,同时如果出现

    1.6K20

    SQL Server 数据库查询性能优化询(不涉及表结构变动情况)

    为了使得优化器能高效使用索引,写语句的时候应该注意: (1)在条件表达式的左则对字段进行运算(如采用运函数处理的)可能导致索引无效 (2)条件内包括了多个本表的字段运算时不能进行索引 (3)多表连接的连接条件对索引的选择有着重要的意义...3、注意临时表和表变量的用法 在复杂系统中,临时表和表变量很难避免,关于临时表和表变量的用法,需要注意: A、如果语句很复杂,连接太多,可以考虑用临时表和表变量分步完成。...E、关于临时表和表变量的选择,很多说法是表变量在内存,速度快,应该首选表变量,但是在实际使用中发现, (1)主要考虑需要放在临时表的数据量,在数据量较多的情况下,临时表的速度反而更快。...关于相关子查询,应该注意: A、NOT IN、NOT EXISTS的相关子查询可以改用LEFT JOIN代替写法。...UPDATE EMPLOYEE SET LNAME='YANG' WHERE EMP_ID=' VPA30890F' 这两个语句应该合并成以下一个语句 UPDATE EMPLOYEE

    72310

    MySQL基础(一)

    不同的数据库生产厂商都支持SQL语句,但都有特有内容。定义:SQL 是用于与关系型数据库交互的标准化编程语言,通过编写 SQL 语句操作 DBMS 中的数据。...* FROM user;等价于select * from user; 1.6 SQL规范SQL语句不区分大小写,建议SQL关键字大写,表名和列表小写命令用分号结尾命令可以缩进和换行,一种类型的关键字放在一行可以写单行和多行注释...delete from与truncate区别在哪里?...4 外键约束外键约束(==多表==关联使用)成绩表中的学生ID应该在学生表中是存在的 我们应该让成绩表中的ID只能引用学生表中的ID,它们的值应该是一一对应的,也就是说成绩表中的ID是成绩表中的外键,对应学生表的主键...排序查询# 通过order by语句,可以将查询出的结果进行排序。暂时放置在select语句的最后。

    49610

    步步深入MySQL:架构->查询执行流程->SQL解析顺序!

    四、SQL解析顺序 接下来再走一步,让我们看看一条SQL语句的前世今生。 首先看一下示例语句: ? 然而它的执行顺序是这样的: ?...虽然自己没想到是这样的,不过一看还是很自然和谐的,从哪里获取,不断的过滤条件,要选择一样或不一样的,排好序,那才知道要取前几条呢。 既然如此了,那就让我们一步步来看看其中的细节吧。...下面从网上找到一张很形象的关于‘SQL JOINS'的解释图,如若侵犯了你的权益,请劳烦告知删除,谢谢。 ?...; 应用: 对主表的过滤应该放在WHERE; 对于关联表,先条件查询后连接则用ON,先连接后条件查询则用WHERE; ?...(如果内存放不下,就需要存放在硬盘了)。

    2K20

    SQL Server优化

    B、 纵向来看,合理写WHERE子句,不要写没有WHERE的SQL语句。     ...SET LNAME=’YANG’ WHERE EMP_ID=’ VPA30890F’ 这两个语句应该合并成以下一个语句 UPDATE EMPLOYEE SET FNAME=’HAIWER’,LNAME...E、 关于临时表和表变量的选择,很多说法是表变量在内存,速度快,应该首选表变量,但是在实际使用中发现,这个选择主要考虑需要放在临时表的数据量,在数据量较多的情况下,临时表的速度反而更快。     ...也可以用语句 SET SHOWPLAN_ALL ON 要执行的语句 SET SHOWPLAN_ALL OFF 查看执行计划的文本详细信息。   ...重点应该放在发现有性能问题的地方,并进行必要的优化。主要进行语句优化、索引优化等。

    2.1K20
    领券