SQL调优导则
1.尽可能避免排序操作。因此对下列语法成分或操作,必须慎用:
a.DISTINCT
b.集合操作UNION ,INTERSECTION, EXCEPT (MINUS)
c.GROUP BY,ORDER BY子句
d.排序归并连接法(除非参与连接的表已经按连接属性排序)
e.建立簇集索引等
2.利用查询条件,尽可能早地消除无用元组,以缩小中间结果:
a.能用WHERE子句表示的查询条件,不要放在HAVING子句中。
查询计算机系所开课程的平均成绩和最高成绩:
SELECT C.CNO,AVG(SC.GRADE),MAX(SC.GRADE)
FROM SC,COURSE C
WHERE C.CNO=SC.CNO
GROUP BY C.CNO
HAVING C.CNO=‘CS%’;
改写后的查询:
SELECT C.CNO,AVG(SCGRADE),MAX(SC.GRADE)
FROM SC,COURSE C
WHERE C.CNO=‘CS%’ AND C.CNO=SC.CNO
GROUP BY C.CNO
b.当心在语句中出现笛卡尔乘积(即无连接条件的连接),慎用外连接、外并操作、非等连接(即连接条件中出现非等号比较符)等操作。
c.在多元连接时,须将选择性高、元组少的表列在FROM子句的前两位,其他表也要按选择性高和元组数少优先原则依次排序,以缩小中间结果。
3.大量加载数据时,不要用INSERT语句:应利用加载工具,例如Oracle中的SQL*Loader
4.EXISTS,IN的应用:慎用关联嵌套子查询,在多数情况,IN比EXISTS较为有利。
5.不滥用视图
视图是按其定义临时生成的中间结果,没有索引之类的存取路径可用。
虽然允许视图的定义中再引用其他视图,但就性能而言,这种多层嵌套的视图不值得采用。如果不是出于安全、保密等的考虑,可将视图定义合并到FROM子句中。
6.当心查询优化器选择全表扫描:如果查询条件中出现比较符“<>”或“IS NULL”等,则查询优化器一般选择全表扫描。
本文提供了一套实用的SQL调优策略,包括避免排序操作、利用查询条件尽早消除无用元组、谨慎使用视图及避免全表扫描等内容,旨在帮助数据库管理员和开发者提升SQL查询效率。
1253

被折叠的 条评论
为什么被折叠?



