【云数据库】云享读书会《SQL优化核心思想》-Q&A干货及学员精彩心得分享~~
云享读书会《SQL优化核心思想》,领域专家徐铭老师现身领读,一起学习,掌握SQL优化技能,提升数据库性能。
本期读书会内容已上云课程,可随时报名学习。
第一部分 干货Q&A
Q:对于复杂的SQL经常会出现A=B B=C C=D 这种情况,会不会影响SQL的执行效率,如果会我应该如何去优化呢?
A:不会,优化器一般会做条件传递。
Q:基于CBO的优化器,SQL在执行的时候,一个SQL产生对应多个执行计划,可以在真正运行的时候,有时候在用的执行计划很慢?只能手动去固话执行计划?每次系统反应慢,除了固定执行计划,有什么好的方法预防这种问题吗?统计信息也没有过期,为什么选择运行慢的执行计划呢?
A:这个原因很多,不同数据库的智能化程度也不一样。
即使统计信息是准的,也不表示一定能选择正确的执行计划。
例如,多个条件组合在一起时,优化器可能估计的rows和实际值可能差距很大。
如果不想固定执行计划,那么尽量把SQL写的简单些,不要给优化器出难题。
Q:1.大数据量下的查询如何优化?2.大数据量下的分页查询如何优化?3.如何做分区表优化和索引优化?
A:1. 这个问题太笼统,SQL优化的核心是减少扫描的数据和做的计算次数。从大数据量中做精确查询要走索引和嵌套循环;必须扫描和连接大数据量,一般是全表扫描和hash join。
2. 大数据量的分页查询一般要通过索引来消除排序,快速定位到目标数据。
3. 分区要适合业务场景,方便清理和查询数据;索引也是要根据查询来定的,如果DML性能要求很高,就要尽量少加索引。
Q:对于选择性很低的列,例如1000w+的行,基数只有3w,如何提高搜索速度,比如对于引擎选择,索引是否建立,建聚集索引还是?还是不需要索引?或者其他方案?不考虑cache!
A:用不用索引,关键看目标数据的占比,大于5%走索引就不好了。TP数据库一般都用B树索引。
Q:业务逻辑上的优化更重要还是SQL语句更为关键?有哪些常规的优化思路?
A:SQL优化和业务优化都很重要,如果能定位到某条SQL是性能瓶颈,并且通过优化索引或者改写SQL可以大幅提升性能,那么就优化SQL,这样代价最小。但是很多场景要端到端的分析性能瓶颈,性能瓶颈不一定在一条SQL上,甚至不是靠优化SQL可以解决的,例如commit过于频繁,redo追尾,热块问题,并发锁等待等,需要从业务逻辑来优化性能。
优化思路:最关键是找到性能瓶颈,然后对症下药。
Q:SQL优化主要优化哪一方面?一般通过什么方式优化?同样大的数据库,直接查询某条记录和优化后查询有什么区别,原理是什么?
A:SQL优化一般是降低需要扫描的数据量。常见的优化方式包括调整表的访问路径、连接方式和连接顺序,以及调整分区、索引规避排序等等。
做不做优化差距非常大,同样的查询可能只要扫描100条数据,也可能需要扫描100亿条数据。
Q:Oracle CBO最优的执行计划需要收集统计信息,但是统计信息收集会lock table,这在OLAP服务器很难实现统计信息收集,所以CBO这个矛盾该怎么解决?
A:收集统计信息一般在空闲时候,通过采样率和并行可以提升收集统计信息的效率。一般数据库不会全程锁定表,而只是短暂的锁定表。收集统计信息并非必要的,可以通过统计信息设置接口直接设定每个表的统计信息。即使不收集统计信息,Oracle也支持动态采样,对于AP数据库采样的代价相对SQL的执行是比较小的。
Q: 1. 慢查询原理?2.如何有效的建立索引?3.怎么合理的拆分表?
A:慢查询往往是执行计划不好,没有选择正确的扫描路径、连接顺序或者连接方式;索引要依据查询场景来创建,过多的索引会降低DML的性能;表的设计首先要符合规范,根据表的大小和使用场景决定是否需要拆分,大表一般要考虑分区。
如果需要对两个表一起查询,并且还要分页查询,那么放在一起比较好,这是出于性能考虑;如果两个表的很多列都是一样的,并且表也不是太大,那么公共列放在一张表比较好,这是出于开发的效率;反之,如果一个表非常大,其中有两种类型数据并且不会同时查询,那么最好拆成多个表。
第二部分 学员精彩心得
1. SQL优化要尽量避免出现笛卡尔积,尽量用大表去关联小表,涉及到索引表的时候,要考虑到索引的用法,自己索引是否失效的问题。
2. 加组合索引,保证查询条件在索引中都能命中,从而保证查询时速度更快。
3. 创建合适的索引是优化查询最重要的手段之一,有效的建立索引能够大幅提高查询效率。但索引并不是越多越好。
4. 尽量避免全表扫描,避免在where子句中使用or、表达式操作、函数操作、!=或<>操作、前置百分号等,否则将导致引擎放弃使用索引而进行全表扫描。
5. 尽量避免使用select *,返回无用的字段会降低查询效率,使用具体的字段代替*,只返回使用到的字段。
6. 建立分区表可提高查询效率。
7. 多表关联的时候要注意是大表在前还是小表在前执行的效率高。
8. 宁愿建立新的SQL语句,也不复用过时的累赘的SQL语句,这样能很好的优化查询速度。
9. 尽可能的使用 varchar/nvarchar 代替 char/nchar ,对应查询来说,可以提高效率。
10. 避免频繁创建和删除临时表。
- 点赞
- 收藏
- 关注作者
评论(0)