7.30实习培训日志-SQL优化
总结
今天早上考试,下午主要是老师引导我们学习SQL优化,晚上主要是同学的技术分享,杨松柏同学主要给我们分享了java的io的一些东西,c10k问题,bio(同步阻塞IO),NIO(同步非阻塞IO),netty,对于NIO的进一步封装,主要因为NIO用起来很麻烦。邵闫利主要给我们讲解了java基础,特别强调设计模式的应用,工厂模式,观察者模式,装饰器模式三者,给我们通俗易懂的讲解虽然我还是不太懂,下来自己去看一下设计模式,后面的同学都给我们讲解了一些新的知识,git rebase,k8s子类的东西,收获良多。
杂项
用in和exists替换distinct
能用union不要用union all
驱动表
wwh999 在 2006年总结说,当进行多表连接查询时, [驱动表] 的定义为:
- 指定了联接条件时,满足查询条件的记录行数少的表为[驱动表];
- 未指定联接条件时,行数少的表为[驱动表](Important!)。
优化
- LEFT JOIN改为JOIN
- 除所有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表记录清空
分区表
create table range_part_tab (id number,deal_date date,area_code number,contents varchar2(4000))
partition by range (deal_date)
(
partition p1 values less than (TO_DATE('2012-02-01', 'YYYY-MM-DD')),
...
partition p_max values less than (maxvalue)
)
;
历史数据管理
开发
避免SQL中函数调用
用表连接代替函数调用
用集合写法
只取所需列
- 访问视图变快,可以避免访问更多表
- 可以通过索引得到列,无需回表
- 表连接变快,避免连接更多的表
超长SQL优化
- case when相同代码封装
- group by简化case when(部分适用)
根据场景选择技术
索引坏处
- 先插入数据,再创建索引。
- 在有索引时插入数据很慢,需要保持数据有序
- 分成两个库(一个生产库,很少索引)(一个查询库,很多索引)
分区慢:分区不加where会使性能变慢
位图索引:位图索引适合只有几个固定值的列,如性别、婚姻状况、行政区等等,而身份证号这种类型不适合用位图索引。
等价改写
-- 不等价 一份复制,两份粘贴
insert all into ljb_tmp_transaction into ljb_tmp_session select * from dba_objects
-- 不等价,同一时刻记录不一样
insert into ljb_tmp_transaction as select * from dba_objects;
insert into jb_tmp_session as select * from dba_objects;
-- 没有办法同时扫描叶子,性能比第二条差,但是不等价
select min(object_id),max(object_id) from t;
-- 不是同一时刻
select max(object_id) from t;
select min(object_id) from t;
-- a,b同时一条,索引不会有笛卡尔积 和第一条等价,性能好
select max, min
from (select max(object_id) max from t ) a,
(select min(object_id) min from t ) b;
in性能好于>,<
需求是顶级优化
7.30实习培训日志-SQL优化的更多相关文章
- 7.31实习培训日志-docker sql
docker mysql docker问题 今天问了老师有关docker的问题,entrypoint和cmd的区别,两者同时存在cmd的执行结果会被当做参数传入entrypoint. dockerfi ...
- 7.27实习培训日志-Oracle SQL(三)
Oracle SQL(三) 视图 特性 简单视图 复杂视图 关联的表数量 1个 1个或多个 查询中包含函数 否 是 查询中包含分组数据 否 是 允许对视图进行DML操作 是 否 CREATE [OR ...
- 7.25实习培训日志-Oracle SQL(一)
Oracle SQL(一) 重点 尽量避免select *,影响性能,不直观. 慎用Distinct,会排序,影响性能,用exists 排序尽量利用索引,索引有序 索引列不要加函数,会使索引失效 外连 ...
- 7.26实习培训日志-Oracle SQL(二)
Oracle SQL(二) 条件表达式 CASE 语句 或者DECODE 函数,两者均可实现 IF-THEN-ELSE 的逻辑,相比较而言,DECODE 更加简洁 SELECT last_name , ...
- 7.24实习培训日志-Docker-Compose
Docker-Compose 对于昨天的考试,需要 项目根目录下需要docker/mysql/Dockerfile 文件用于构建mysql镜像 项目根目录下需要docker/java/Dockerfi ...
- 7.23实习培训日志-JDBC
总结 今天下午考试,JDBC,这个本身很简单,但是需要我们Dockerfile+Docker Compose运行,这个东西就很复杂.原来学习时没有怎么看,这一次就很懵,完全不知道怎么弄,反正环境都没有 ...
- 7.29实习培训日志-Oracle题目
总结 这周主要学习了SQL,oracle中的SQL基础,以前学习的是SQLserver的SQL,和oracle的还是有略微不同,所以重新去学习了一段时间,然后对于oracle中的各种函数有了初步了解, ...
- 7.21实习培训日志-JDBC JSP Servlet
JDBC JSP Servlet 总结 今天早上的考试主要考Java的网络,HttpClient的get,post方法,Socket的文件传输和Xml和Json文件的解析,对于HttpCLient很简 ...
- 7.19实习培训日志- java进阶
java进阶 java集合 Collection List ArrayList jdk1.2,异步处理,性能高,线程不安全 Vector jdk1.0,同步处理,性能低,线程安全 Set HashSe ...
随机推荐
- DELPHI-Delphi常用类型及定义单元
DELPHI-Delphi常用类型及定义单元 Type Unit Date SysUtils DeleteFile SysUtils or Windows (different versions) D ...
- java 获取访问主机的ip地址
Java的api的说法: getHeader public java.lang.String getHeader(java.lang.String name) Return the first val ...
- AJAX+json+jquery实现预加载瀑布流布局
宽度是一定的高度不定的瀑布流布局 也可以说是无缝拼图 当浏览器滚动到底部时候自动加载图片 加载的图片地址用json 在img.js里 ,还有正在加载动画是用 css3制作的 在ff等支持css3可以显 ...
- django admin扩展user表password验证及set_password
一般如果扩展了django user内置表,在admin后台创建新用户的时候密码将会变成明文,故而导致登录不成功.所以我们在admin.py可以通过form自定义进行对password进行操作,可以双 ...
- 创建第一个Servlet并定制Sevlet模板
我们已经为eclipse配好了Tomcat服务器,创建了Web工程,现在是时候该创建一个Servlet向世界问好了! 第一步:创建一个Web工程,选中”src“文件夹 -->单击右键,鼠标移到” ...
- python习题-判断输入字符串是不是小数类型
写一个能判断输入的字符串是不是个小数类型的1,判断小数点的个数是否为1 count2,判断是否小数右边是整数 isdigit3,判断小数点左边的1,整数 isdigit ,2如果是负整数,取负号右边, ...
- stl_queue.h
stl_queue.h // Filename: stl_queue.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http:/ ...
- json 文件解析与应用
第一步:首先弄一个 json 文件 我这里成为 config.json 内容如下 { ": { , "desc":"中华人民共和国" }, &qu ...
- Mule ESB学习【转-结合了网络上的一些资源】
1.SOA标准之一:SCA架构思想 SOA在Java领域有两套标准:一个是SUN推出的JBI(没有得到BEA和IBM的承认),另外一个是:IBM和BEA等公司推出的SCA和SDO标准. JBI之关注J ...
- 【LeetCode】023. Merge k Sorted Lists
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 题 ...