达梦8技术支持笔记(9)

数据库优化笔记

1、数据库访问优化法则简介

要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里?而大多数情况性能最慢的设备会是瓶颈点,如下载时网络速度可能会是瓶颈点,本地复制文件时硬盘可能会是瓶颈点,为什么这些一般的工作我们能快速确认瓶颈点呢,因为我们对这些慢速设备的性能数据有一些基本的认识,如网络带宽是2Mbps,硬盘是每分钟7200转等等。因此,为了快速找到SQL的性能瓶颈点,我们也需要了解我们计算机系统的硬件基本性能指标,下图展示的当前主流计算机性能指标数据。

 

从图上可以看到基本上每种设备都有两个指标:

延时(响应时间):表示硬件的突发处理能力;

带宽(吞吐量):代表硬件持续处理能力。

 

从上图可以看出,计算机系统硬件性能从高到代依次为:

CPU——Cache(L1-L2-L3)——内存——SSD硬盘——网络——硬盘

由于SSD硬盘还处于快速发展阶段,所以本文的内容不涉及SSD相关应用系统。

根据数据库知识,我们可以列出每种硬件主要的工作内容:

CPU及内存:缓存数据访问、比较、排序、事务检测、SQL解析、函数或逻辑运算;

网络:结果数据传输、SQL请求、远程数据库访问(dblink);

硬盘:数据访问、数据写入、日志记录、大数据量排序、大表连接。

 

 

 

根据当前计算机硬件的基本性能指标及其在数据库中主要操作内容,可以整理出如下图所示的性能基本优化法则:

 

 

 

这个优化法则归纳为5个层次:

1、  减少数据访问(减少磁盘访问)

2、  返回更少数据(减少网络传输或磁盘访问)

3、  减少交互次数(减少网络传输)

4、  减少服务器CPU开销(减少CPU及内存开销)

5、  利用更多资源(增加资源)

 

由于每一层优化法则都是解决其对应硬件的性能问题,所以带来的性能提升比例也不一样。传统数据库系统设计是也是尽可能对低速设备提供优化方法,因此针对低速设备问题的可优化手段也更多,优化成本也更低。我们任何一个SQL的性能优化都应该按这个规则由上到下来诊断问题并提出解决方案,而不应该首先想到的是增加资源解决问题。

以下是每个优化法则层级对应优化效果及成本经验参考:

 

 

优化法则

性能提升效果

优化成本

减少数据访问

1~1000

低

返回更少数据

1~100

低

减少交互次数

1~20

低

减少服务器CPU开销

1~5

低

利用更多资源

@~10

高

2、优化

1、别用<>不等于,不走索引,拆成> or <。

2、null的判断不走索引,尽量给列默认值。

3、union all 替换union。

4、全模糊查询拆开,或者用全文索引。

5、where 后面先放走索引的,删的多的。

6、隐式转换不走索引

7、data时间戳尽量用>\< ,用函数不走索引。

8、>=   <= 比 <   > 快。

9、不用*。

10、索引对DML(INSERT,UPDATE,DELETE)附加的开销有多少?

这个没有固定的比例,与每个表记录的大小及索引字段大小密切相关,以下是一个普通表测试数据,仅供参考:

索引对于Insert性能降低56%

索引对于Update性能降低47%

索引对于Delete性能降低29%

因此对于写IO压力比较大的系统,表的索引需要仔细评估必要性,另外索引也会占用一定的存储空间。

11、In List

很多时候我们需要按一些ID查询数据库记录,我们可以采用一个ID一个请求发给数据库,如下所示:

for :var in ids[] do begin

  select * from mytable where id=:var;

end;

 

我们也可以做一个小的优化, 如下所示,用ID INLIST的这种方式写SQL:

select * from mytable where id in(:id1,id2,...,idn);

       另外当前数据库一般都是采用基于成本的优化规则,当IN数量达到一定值时有可能改变SQL执行计划,从索引访问变成全表访问,这将使性能急剧变化。随着SQL中IN的里面的值个数增加,SQL的执行计划会更复杂,占用的内存将会变大,这将会增加服务器CPU及内存成本。

评估在IN里面一次放多少个值还需要考虑应用服务器本地内存的开销,有并发访问时要计算本地数据使用周期内的并发上限,否则可能会导致内存溢出。

综合考虑,一般IN里面的值个数超过20个以后性能基本没什么太大变化,也特别说明不要超过100,超过后可能会引起执行计划的不稳定性及增加数据库CPU及内存成本,这个需要专业DBA评估。

12、合理使用merge join 和hash join。

13、指定并行查询PARALLEL。

14、绑定变量复用执行计划

15、用exists代替distanct

16、写定时job在晚上预处理数据。

3、实例

1、cpu过高,开启游标共享,分会话级和永久。

2、数据量大使用分区技术、merge into技术,外部表优化。

3、少用函数索引,其维护成本和索引存储空间大于普通索引。

4、复合索引的前缀性和可选性,数据文件脱机,日志发现是异步i/o过多,超出允许范围,综合查询模块在各个条件上建立组合索引导致。

5、监控业务场景索引,删除无用索引,定期清理索引碎片,rebuild。

6、oltp优化parse阶段,olap优化execute和fetch阶段。

7、提高表连接性能,分析嵌套连接、排序连接、哈希连接。

8、hint强制修改执行计划,全局生效。

9、扩展快的频繁申请,临时表的反复分配,日志组的反复切换,调大参数。

posted @ 2020-09-15 20:44  gamersansan  阅读(869)  评论(0)    收藏  举报