【云数据库】云享读书会《SQL优化核心思想》-Q&A干货及学员精彩心得分享~~

平常心 发表于 2020/05/07 16:27:14 2020/05/07
【摘要】 云享读书会《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.如何做分区表优化和索引优化?

A1. 这个问题太笼统,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.  避免频繁创建和删除临时表。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。