这十条经验是作者自己进行总结的结果,配合一些代码进行解释。希望本文能给各位数据库管理员在性能优化方面一些启示。

1.查询的含糊匹配

高手详解SQL功能优化十条经历(常见的sql优化技巧)  SQL 优化 经验 第1张

尽量防止在一个杂乱查询里边运用 LIKE '%parm1%'—— 赤色标识方位的百分号会导致相关列的索引无法运用,***不要用.

解决办法:

其实只需求对该脚本略做改善,查询速度便会进步近百倍。改善办法如下:

a、修正前台程序——把查询条件的供货商称号一栏由本来的文本输入改为下拉列表,用户含糊输入供货商称号时,直接在前台就帮助定位到详细的供货商,这样在调用后台程序时,这列就能够直接用等于来相关了。

b、直接修正后台——依据输入条件,先查出契合条件的供货商,并把相关记载保存在一个暂时表里头,然后再用暂时表去做杂乱相关

2.索引问题

在做功用盯梢剖析进程中,常常发现有不少后台程序的功用问题是因为短少适宜索引形成的,有些表乃至一个索引都没有。这种状况往往都是因为在规划表时,没去界说索引,而开发初期,因为表记载很少,索引创立与否,或许对功用没啥影响,开发人员因而也未多加注重。然一旦程序发布到出产环境,跟着时刻的推移,表记载越来越多

这时短少索引,对功用的影响便会越来越大了。

这个问题需求数据库规划人员和开发人员一起重视

规律:不要在树立的索引的数据列上进行下列操作:

◆防止对索引字段进行核算操作

◆防止在索引字段上运用not,<>,!=

◆防止在索引列上运用IS NULL和IS NOT NULL

◆防止在索引列上呈现数据类型转化

◆防止在索引字段上运用函数

◆防止树立索引的列中运用空值。

3.杂乱操作

部分UPDATE、SELECT 句子 写得很杂乱(常常嵌套多级子查询)——能够考虑恰当拆成几步,先生成一些暂时数据表,再进行相关操作

4.update

同一个表的修正在一个进程里呈现好几十次,如:

update table1
set col1=...
where col2=...;
update table1
set col1=...
where col2=...
......

象这类脚本其实能够很简略就整合在一个UPDATE句子来完结(前些时候在帮忙xxx项目做功用问题剖析时就发现存在这种状况)

5.在能够运用UNION ALL的句子里,运用了UNION

UNION 因为会将各查询子集的记载做比较,故比起UNION ALL ,一般速度都会慢上许多。一般来说,假如运用UNION ALL能满足要求的话,必须运用UNION ALL。还有一种状况我们或许会疏忽掉,便是尽管要求几个子集的并集需求过滤掉重复记载,但因为脚本的特殊性,不或许存在重复记载,这时便应该运用UNION ALL,如xx模块的某个查询程序就从前存在这种状况,见,因为句子的特殊性,在这个脚本中几个子集的记载肯定不或许重复,故能够改用UNION ALL)

6.在WHERE 句子中,尽量防止对索引字段进行核算操作

这个知识信任绝大部分开发人员都应该知道,但仍有不少人这么运用,我想其间一个最主要的原因或许是为了编写写简略而损害了功用,那就不行取了

9月份在对XX体系做功用剖析时发现,有很多的后台程序存在相似用法,如:

......
where trunc(create_date)=trunc(:date1)

尽管已对create_date 字段建了索引,但因为加了TRUNC,使得索引无法用上。此处正确的写法应该是

where create_date>=trunc(:date1) and create_date

或许是

where create_date between trunc(:date1) and trunc(:date1)+1-1/(24*60*60)

留意:因between 的规模是个闭区间(greater than or equal to low value and less than or equal to high value.),

故严厉意义上应该再减去一个趋于0的小数,这儿暂时设置成减去1秒(1/(24*60*60)),假如不要求这么准确的话,能够略掉这步。

7.对Where 句子的规律

7.1 防止在WHERE子句中运用in,not in,or 或许having

能够运用 exist 和not exist替代 in和not in。

能够运用表链接替代 exist。Having能够用where替代,假如无法替代能够分两步处理。

比如

SELECT * FROM ORDERS WHERE CUSTOMER_NAME NOT IN 
(SELECT CUSTOMER_NAME FROM CUSTOMER)

优化


SELECT * FROM ORDERS WHERE CUSTOMER_NAME not exist
(SELECT CUSTOMER_NAME FROM CUSTOMER)

7.2 不要以字符格局声明数字,要以数字格局声明字符值。(日期相同)不然会使索引无效,发生全表扫描。

比如运用:

SELECT emp.ename, emp.job FROM emp WHERE emp.empno = 7369;
不要运用:SELECT emp.ename, emp.job FROM emp WHERE emp.empno = ‘7369’

8.对Select句子的规律

在应用程序、包和进程中约束运用select * from table这种方法。看下面比如

运用SELECT empno,ename,category FROM emp WHERE empno = '7369‘
而不要运用SELECT * FROM emp WHERE empno = '7369'

9. 排序

防止运用消耗资源的操作,带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL句子会发动SQL引擎 履行,消耗资源的排序(SORT)功用. DISTINCT需求一次排序操作, 而其他的至少需求履行两次排序

10.暂时表

稳重运用暂时表能够极大的进步体系功用

【修改引荐】

  1. 浅谈怎么优化SQL Server服务器
  2. SQL Server数据库优化经验总结
  3. Oracle SQL句子优化的相关技能剖析
转载请说明出处
知优网 » 高手详解SQL功能优化十条经历(常见的sql优化技巧)

发表评论

您需要后才能发表评论