总结

今天早上考试,下午主要是老师引导我们学习SQL优化,晚上主要是同学的技术分享,杨松柏同学主要给我们分享了java的io的一些东西,c10k问题,bio(同步阻塞IO),NIO(同步非阻塞IO),netty,对于NIO的进一步封装,主要因为NIO用起来很麻烦。邵闫利主要给我们讲解了java基础,特别强调设计模式的应用,工厂模式,观察者模式,装饰器模式三者,给我们通俗易懂的讲解虽然我还是不太懂,下来自己去看一下设计模式,后面的同学都给我们讲解了一些新的知识,git rebase,k8s子类的东西,收获良多。

杂项

用in和exists替换distinct

能用union不要用union all

驱动表

wwh999 在 2006年总结说,当进行多表连接查询时, [驱动表] 的定义为:

  1. 指定了联接条件时,满足查询条件的记录行数少的表为[驱动表];
  2. 未指定联接条件时,行数少的表为[驱动表](Important!)。

优化

  1. LEFT JOIN改为JOIN
  2. 除所有JOIN,让MySQL自行决定

连表查询之驱动表

基于案例学习的sql优化

从案例中推导SQL优化的总体思路与误区

count(*) count(列)

无索引:count(*) count(列)一样

有索引:列非空(count() count(列)一样) (列可空)count() count(列)不一样

但是count(*)与 count(列)不等价

count(*):会统计null列,count(列)不会计算Null列

count()速度最快,列的偏移量决定性能,列越靠后,访问开销越大,count()与列无关,所以count(*)速度最快,count(最后列)速度最慢

sql书写顺序

表的连接顺序

大表在前,小表在后是基于规则的时代(select /*+rule*/ count(*) from tab_big,tab.small),现在是基于代价的时代,两种写法一样的。

表的条件顺序

过滤条件越多,越放在后面-> 错

not in,not exists

anti反连接算法比filter高效,10g中,oracle指定非空,not in才用anti算法.11g中not in 和not exists一样,无论是否非空,都走anti算法。

设计

全局临时表

delete删除开销大,占用大量回滚段和产生大量日志。

CREATE GLOBAL TEMPORARY TABLE temp_table_session (...) ON COMMIT (PRESERVE|DELETE) ROWS

session全局临时表:退出session记录清空

基于事务全局临时表:commit表记录清空

分区表

  1. create table range_part_tab (id number,deal_date date,area_code number,contents varchar2(4000))
  2. partition by range (deal_date)
  3. (
  4. partition p1 values less than (TO_DATE('2012-02-01', 'YYYY-MM-DD')),
  5. ...
  6. partition p_max values less than (maxvalue)
  7. )
  8. ;

oracle的 分表 详解 -----表分区

历史数据管理

开发

避免SQL中函数调用

用表连接代替函数调用

用集合写法

只取所需列

  1. 访问视图变快,可以避免访问更多表
  2. 可以通过索引得到列,无需回表
  3. 表连接变快,避免连接更多的表

超长SQL优化

  • case when相同代码封装
  • group by简化case when(部分适用)

根据场景选择技术

索引坏处

  1. 先插入数据,再创建索引。
  2. 在有索引时插入数据很慢,需要保持数据有序
  3. 分成两个库(一个生产库,很少索引)(一个查询库,很多索引)

分区慢:分区不加where会使性能变慢

位图索引:位图索引适合只有几个固定值的列,如性别、婚姻状况、行政区等等,而身份证号这种类型不适合用位图索引。

等价改写

  1. -- 不等价 一份复制,两份粘贴
  2. insert all into ljb_tmp_transaction into ljb_tmp_session select * from dba_objects
  3. -- 不等价,同一时刻记录不一样
  4. insert into ljb_tmp_transaction as select * from dba_objects;
  5. insert into jb_tmp_session as select * from dba_objects;
  6. -- 没有办法同时扫描叶子,性能比第二条差,但是不等价
  7. select min(object_id),max(object_id) from t;
  8. -- 不是同一时刻
  9. select max(object_id) from t;
  10. select min(object_id) from t;
  11. -- ab同时一条,索引不会有笛卡尔积 和第一条等价,性能好
  12. select max, min
  13. from (select max(object_id) max from t ) a,
  14. (select min(object_id) min from t ) b;

in性能好于>,<

需求是顶级优化

BIO,NIO,AIO的区别

7.30实习培训日志-SQL优化的更多相关文章

  1. 7.31实习培训日志-docker sql

    docker mysql docker问题 今天问了老师有关docker的问题,entrypoint和cmd的区别,两者同时存在cmd的执行结果会被当做参数传入entrypoint. dockerfi ...

  2. 7.27实习培训日志-Oracle SQL(三)

    Oracle SQL(三) 视图 特性 简单视图 复杂视图 关联的表数量 1个 1个或多个 查询中包含函数 否 是 查询中包含分组数据 否 是 允许对视图进行DML操作 是 否 CREATE [OR ...

  3. 7.25实习培训日志-Oracle SQL(一)

    Oracle SQL(一) 重点 尽量避免select *,影响性能,不直观. 慎用Distinct,会排序,影响性能,用exists 排序尽量利用索引,索引有序 索引列不要加函数,会使索引失效 外连 ...

  4. 7.26实习培训日志-Oracle SQL(二)

    Oracle SQL(二) 条件表达式 CASE 语句 或者DECODE 函数,两者均可实现 IF-THEN-ELSE 的逻辑,相比较而言,DECODE 更加简洁 SELECT last_name , ...

  5. 7.24实习培训日志-Docker-Compose

    Docker-Compose 对于昨天的考试,需要 项目根目录下需要docker/mysql/Dockerfile 文件用于构建mysql镜像 项目根目录下需要docker/java/Dockerfi ...

  6. 7.23实习培训日志-JDBC

    总结 今天下午考试,JDBC,这个本身很简单,但是需要我们Dockerfile+Docker Compose运行,这个东西就很复杂.原来学习时没有怎么看,这一次就很懵,完全不知道怎么弄,反正环境都没有 ...

  7. 7.29实习培训日志-Oracle题目

    总结 这周主要学习了SQL,oracle中的SQL基础,以前学习的是SQLserver的SQL,和oracle的还是有略微不同,所以重新去学习了一段时间,然后对于oracle中的各种函数有了初步了解, ...

  8. 7.21实习培训日志-JDBC JSP Servlet

    JDBC JSP Servlet 总结 今天早上的考试主要考Java的网络,HttpClient的get,post方法,Socket的文件传输和Xml和Json文件的解析,对于HttpCLient很简 ...

  9. 7.19实习培训日志- java进阶

    java进阶 java集合 Collection List ArrayList jdk1.2,异步处理,性能高,线程不安全 Vector jdk1.0,同步处理,性能低,线程安全 Set HashSe ...

随机推荐

  1. hihocoder第七周 完全背包模板题

    时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说之前的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时刻了! 等等,这段故事为 ...

  2. EntityFramework 学习 一 Persistence in Entity Framework

    实体框架的持久化 当用EntityFramework持久化一个对象时,有两种情形:连接的和断开的 1.连接场景:使用同一个context上下文从数据库中查询和持久化实体时,查询和持久化实体期间,con ...

  3. mysql 数据库使用

    1. 常用命令 2. 创建表 create table test ( test_id int, test_price decimal ); 或者 create table test2 as selec ...

  4. Codeforces 455C Civilization:树的直径 + 并查集【合并树后直径最小】

    题目链接:http://codeforces.com/problemset/problem/455/C 题意: 给你一个森林,n个点,m条边. 然后有t个操作.共有两种操作: (1)1 x: 输出节点 ...

  5. php设计模式课程---7、装饰器模式如何使用

    php设计模式课程---7.装饰器模式如何使用 一.总结 一句话总结: 装饰器的核心是获取了文章类整个类,而不是获取了文章内容,有了这个文章类,我想给你加多少装饰就给你加多少装饰(将文章这个类封装进去 ...

  6. 英语发音规则---/ŋ/与/ŋg/的读音区别

    英语发音规则---/ŋ/与/ŋg/的读音区别 一.总结 一句话总结: 1.位于词中间的字母组合ng,有时读作/ ŋ /,有时读作/ ŋg/? singer ['sɪŋə] n. 歌手 ringing ...

  7. C++(七)— 进程、线程及区别

    1.进程(process) 狭义定义:进程就是一段程序的执行过程. 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动.它是操作系统动态执行的基本单元,在传统的操作系统中,进程既 ...

  8. priority_queue用法(转载)

    关于priority_queue 1,关于STL中的priority_queue:确定用top()查看顶部元素时,该元素是具有最高优先级的一个元素. 调用pop()删除之后,将促使下一个元素进入该位置 ...

  9. How to reduce Index size on disk?减少ES索引大小的一些小手段

    ES索引文件瘦身总结如下: 原始数据:(1)学习splunk,原始data存big string(2)原始文件还可以再度压缩倒排索引:(1)去掉不必要的倒排索引信息:例如文件位置倒排._source和 ...

  10. php函数decbin

    decbin()将十进制转换为二进制.必须有一个十进制参数.