【再回首:数据库篇】SQL语句的优化

SQL语句的优化

SQL实际生产中的现状

在实际生产工作中,每日的数据流水很大时,优质SQL语句与劣质的SQL语句天差地别。优质的SQL语句在日常生活中,能提高查询、操作数据库的效率,而劣质的SQL语句,轻则查询效率低,重则数据库宕机。
在这里插入图片描述

SQL开发的一般流程

在这里插入图片描述
在日常开发中,不能拿到项目就开始编写程序,应该先观察表结构,查看内部联系,查看是否有索引,如果没有应当适当添加索引,在确定思路后,开始开发,这样可以提高适用性,减少开发程序的错误率和运行性能问题。

禁止使用的SQL语句类型

1.严格禁止跨物理数据库关联查询,无论数据量大小。

错误事例如下:

select a.empno, b.deptno 
		from remotedb@onhdrb:empno a , statistics@onhdrb:tjywbm b 
		where a.deptno=b.ywbm;

2.严格禁止3个表以上的关联查询,无论表内记录值有多少条。

错误事例如下:

select  	processtype, ds_process.ds_process_id, ds_process.createperson,
            ds_process.startdatetime, dsb_apply.dsb_apply_id, ds_activity.executeorg,
    	ds_activity.step
from ds_activity, ds_process, dsb_apply 
where   	ds_process.ds_process_id=dsb_apply.ds_process_id and
    	ds_process.processtype=3 and ds_process.nextactivitytype=2 and
    	ds_process.createperson=3394 and
    	ds_activity.ds_activity_id=ds_process.ds_activity_id order by
    	dsb_apply.dsb_apply_id desc

上面的事例如若在数据量巨大的时候很有可能,让服务器宕机,关联过多且查询量大时,查询效率极其低。

2.严格禁止两表均超过5000条以上记录的两个表的关联查询

两表均超过5000条以上记录的关联表查询要填定<<关联SQL语句编写审批表>>,经审批同意才能按审批同意的语句使用(关联字段也需建立在索引基础上)。当Where 子句中包含多个表联立时,应把返回行数最少的排在最后。

关于事务提交的处理方法

提交事务原则上应在后台程序进行,严格禁止C/S结构、B/S结构类系统在前台处理程序中提交离散性、等待性事务。由于长事务容易造成数据库死锁,所以事务开始与事务结束之间,应集中编写,一次性提交,且禁止有select语句存在。(但可以有开发工具本身的不引起数据库操作的函数和语句,也可有PB自身的自动提交功能)。

不建议使用的SQL语句

1.关于多用户并发抢占唯一流水号的处理

多用户并发抢号机制建议采用“共享-抢占-重试”的方式进行,不建议采用“抢点-锁定-解锁”的方式进行。

2. 关于统计程序“抽取”语句与“推送”语句的处理。

原则上不建议采用向源表采用正向“抽取“数据的方式,而应采取通过一次扫描源表向多个目的表”推送“填写数据的方式来开发统计、汇总类程序,可有效提高运行效率

3. 大量的排序操作影响系统性能

所以尽量减少order by,group by,distinct等排序操作;如必须使用排序操作,排序应建立在有索引的列上.同时不建议使用关联查询的多字段排序。

4. 不建议使用SELECT *;

SELECT语句中应写出要选择的全部列名,增强语句可读性,避免不必要的选择;SELECT * 增加了对所有字段的依赖,当表增加了字段后,有可能发生错误;此外还可能增加了数据的流量,查询了一些实际不需要的字段;

5. SQL语句中除字符串中必须大写的内容外,全部小写,包括关键字

因为大小写结合需要 输入大写字母速度慢。(相同的SQL语句是在SQL缓冲区中读取,SQL分析器不用对SQL语句重新分析产生执行计划,系统响应时间大大减少)。

原文地址:https://www.cnblogs.com/ac4nd/p/12964753.html