首页 > 代码库 > 数据库学习——SQL调优
数据库学习——SQL调优
一、SQL调优与查询优化器
数据库性能调优一般从发现、分析和解决SQL语句执行中的问题着手,这个过程统称为SQL调优(SQL tuning)。
1.了解查询优化器
例如,有些查询优化器对于连接操作,一般按连接对象在FROM子句中出现的先后次序进行连接。SQL程序设计者可以利用此特点将选择性高的小表放在前面,大表放在后面,以尽快淘汰无用的中间结果,从而节省查询处理开销。又如,有些查询优化器中,凡是查询条件用OR连接的,就一概不用索引,因而只能用全表扫描,可以考虑使用UNION ALL代替OR。
2.用提示语句影响查询优化器拟订执行计划
二、SQL调优导则
1.尽可能避免排序操作
排序是开销很大的操作,尤其大表的排序,往往超出内存允许的范围,需用磁盘排序,CPU,I/O和内存开销都很大,不但降低语句的性能,还影响数据库的整体性能。以下语法成分和操作需慎用:
(1)DISTINCT
(2)集合操作 UNION,INTERSECTION,EXCEPT(MINUS)
(3)GROUP BY,ORDER BY子句
(4)排序归并连接法(除非参与连接的表已经按连接属性排序或是小表)
(5)建立簇集索引等
2.利用查询条件,尽可能早地消除无用元组,以缩小中间结果
(1)能用where子句表示的查询条件,不要放在having子句中。
(2)当心在语句中出现笛卡尔乘积,慎用外连接、外并操作、非等连接等操作
(3)在多元连接时,须将选择性高、元组少的表列在from子句的前两位,其他表也要按选择性高和元组数少的优先原则依次排序,以缩小中间结果。
3.大量加载数据时,不要用insert语句
目前各DBMS都提供了响应的加载工具,例如,oracle中的SQL*Loader,它有下列特点:
(1)跳过DBMS的查询处理系统,直接以页为单位,传输到数据库的存储系统。
(2)不留前、后像记录。
(3)不更新索引。
(4)停止主键唯一性检查、触发子功能和数据特征统计数据的收集。
4.慎用EXISTS,IN子查询
连接语句有时可用EXISTS或IN子查询取代;反之,也可将含有EXISTS或IN子查询的语句转换成连接语句。究竟用何种形式表示,决定于查询条件和可用的索引。
IN和EXISTS一般可以互相取代。如果选择谓词在父查询中,一般宜用EXISTS;如果选择谓词在子查询中,一般宜用IN。
5.不滥用视图
视图是按其定义临时生成的中间结果,没有索引之类的存取路径可用,且对其处理有诸多限制,就数据库性能而言,视图有弊无利。
如果不是出于安全、保密等考虑,可将视图定义合并到from子句中。
6.当心查询优化器会全表扫描
如果查询条件中出现比较符‘<>’IS NULL‘等,则查询优化器一般选择全表扫描。如是小表,则影响不大;如是大表,则会严重影响数据库的性能。因为在索引中,一般不包含索引键为‘NULL’的元组。当用‘IS NULL’查询时,则查询优化器不会选用索引,而采用全表扫描。
数据库学习——SQL调优