当前所在位置: 首页 > 数码科技 > 正文

sql查询优化的几种方法

2024-04-25 本站作者 【 字体:

1、ORACLE 的解析器按照从右到左的顺序处理 FROM 子句中的表名,因此 FROM 子句中写在最后的表基础表 driving table将被最先处理。在FROM 子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。

例如:

表ceshi_xiao有969条记录,emp_xiao有14条记录。

select count* from emp_xiao, ceshi_xiao;低效方法

select count* from ceshi_xiao, emp_xiao;高效方法

sql查询优化的几种方法

注意:这里由于ceshi_xiao表记录太少差别不明显,但已经能看出差别。当表记录上百万条时,该差距会无限放大。

2、ORACLE 采用自下而上的顺序解析 WHERE 子句。

根据这个原理,表之间的连接必须写在其他 WHERE 条件之前, 那些可以过滤掉最大数量记录的条件必须写在 WHERE 子句的末尾。

例如:

SELECT …

FROM EMP E

WHERE SAL 50000

AND JOB = ‘MANAGER'

AND 25 SELECT COUNT* FROM EMP

WHERE MGR=E.EMPNO; 低效,执行时间 156.3秒

SELECT …

FROM EMP E

WHERE 25 SELECT COUNT* FROM EMP

WHERE MGR=E.EMPNO

AND SAL 50000

AND JOB = ‘MANAGER';高效,执行时间 10.6秒

注意:在进行多表关联时,多用 Where 语句把单个表的结果集最小化,多用聚合函数汇总结果集后再与其它表做关联,以使结果集数据量最小化。

3、减少对表的查询。

在含有子查询的 SQL语句中,要特别注意减少对表的查询。

4、用EXISTS替代IN。

在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在这 种情况下, 使用 EXISTS或 NOT EXISTS通常将提高查询的效率。使用 exists 而不用 IN 因为 Exists 只检查行的存在,而 in 检查实际值。

例如:

SELECT *

FROM EMP 基础表

WHERE EMPNO 0

AND DEPTNO IN SELECT DEPTNO

FROM DEPT

WHERE LOC = ‘MELB'低效

SELECT *

FROM EMP 基础表

WHERE EMPNO 0

AND EXISTS SELECT ‘X'

FROM DEPT

WHERE =

AND LOC = ‘MELB' 高效

用 IN 的 SQL 性能总是比较低,原因是:对于用 IN 的 SQL 语句 ORACLE 总是试图将其转换成多个表的连接,如果转换不成功则先执行 IN里面的子查询,再查询外层的表记录如果转换成功就转换成多个表的连接。因此 不管理怎么,用 IN 的 SQL 语句总是多了 一个转换的过程。因此在业务密集的SQL当中尽量不采用IN操作符。

5、用EXISTS替换DISTINCT。

当提交一个包含一对多表信息比如部门表和雇员表的查询时,避免在SELECT 子句 中使用 DISTINCT. 一般可以考虑用 EXIST 替换。

例如:SELECT DISTINCT DEPT_NO,DEPT_N

FROM DEPT D,EMP E

WHERE D.DEPT_NO = E.DEPT_NO低效

SELECT DEPT_NO,DEPT_NAME

FROM DEPT D

WHERE EXISTS SELECT ‘X'

FROM EMP E

WHERE E.DEPT_NO = D.DEPT_NO;高效

6、用表连接替换EXISTS。

通常来说 ,采用表连接的方式比 EXISTS 更有效率。

例如:

SELECT ENAME

FROM EMP E

WHERE EXISTS SELECT ‘X'

FROM DEPT

WHERE DEPT_NO = E.DEPT_NO

AND DEPT_CAT = ‘A';

为了提高效率。改写为:

SELECT ENAME

FROM DEPT D,EMP E

WHERE E.DEPT_NO = D.DEPT_NO

AND DEPT_CAT = ‘A' ;

7、避免在索引列上使用计算。

WHERE 子句中,如果索引列是函数的一部分。优化器将不使用索引而使用全表扫描。这是一个非常实用的规则,请务必牢记。

例如:

SELECT …

FROM DEPT

WHERE SAL * 12 25000; 低效

SELECT …

FROM DEPT

WHERE SAL ; 高效

8、避免在索引列上使用NOT。

通常,我们要避免在索引列上使用 NOT,NOT 会产生在和在索引列上使用函数相同 的影响。当ORACLE“遇到”NOT,他就会停止使用索引转而执行全表扫描。

9、不使用、!=、~=、^=操作符。

不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。

a 0 == a 0 or a 0

10、用=替代。

SELECT *

FROM EMP

WHERE DEPTNO 3低效

SELECT *

FROM EMP

WHERE DEPTNO =4高效

两者的区别在于, 前者 DBMS将直接跳到第一个 DEPT 等于 4的记录而后者将首先定位到 DEPTNO=3的记录并且向前扫描到第一个 DEPT 大于 3的记录。

11、不使用like 操作符。

遇到 需要用到 LIKE 过滤的SQL语句,完全可以用 instr 代替,处理速度将显著提高。

12、用UNIONUNION ALL替换OR 适用于索引列。

通常情况下, 用 UNION替换 WHERE 子句中的 OR将会起到较好的效果。对索引列使用 OR将造成全表扫描。注意, 以上规则只针对多个索引列有效。 如果有 column没有被索引, 查询效率可能会因为你没有选择 OR而降低。

如果你坚持要用 OR, 那就需要返回记录最少的索引列写在最前面。注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低。

13、优化GROUP BY。

提高 GROUP BY 语句的效率, 可以通过将不需要的记录在 GROUP BY 之前过滤掉。下面两个查询返回相同结果但第二个明显就快了许多。

例如:

SELECT JOB , AVGSAL

FROM EMP

GROUP by JOB

HAVING JOB = ‘PRESIDENT'

OR JOB = ‘MANAGER'低效

SELECT JOB , AVGSAL

FROM EMP

WHERE JOB = ‘PRESIDENT'

OR JOB = ‘MANAGER'GROUP by JOB高效

使用 where 而不是 having ,where是用于过滤行的,而having是用来过滤组的,因为行被分组后,having 才能过滤组,所以尽量用 WHERE 过滤。

14、避免改变索引列的类型。

当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换。

15、SQL书写的影响。

同一功能同一性能不同写法SQL的影响。

例如:

如一个SQL在A程序员写的为select * from zl_yhjbqk

B程序员写的为select * from 带表所有者的前缀

C程序员写的为select * from 大写表名

D程序员写的为select * from 中间多了空格

四个SQL在ORACLE分析整理之后产生的结果及执行的时间是一样的,但是从ORACLE共享内存SGA的原理,可以得出ORACLE对每个SQL都会对其进行一次分析,并且占用共享内存,如果将SQL的字符串及格式写得完全相同则ORACLE只会分析一次,共享内存也只会留下一次的分析结果,这不仅可以减少分析SQL的时间,而且可以减少共享内存重复的信息,ORACLE也可以准确统计SQL的执行频率。

总结:

1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。

2.应尽量避免在 where 子句中使用!=或操作符,否则将引擎放弃使用索引而进行全表扫描。

3.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。

4.in 和 not in 也要慎用,否则会导致全表扫描。

5.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

6.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。

阅读全文
相关推荐

2024去云南旅游最佳路线 云南旅游的最佳路线安排

2024去云南旅游最佳路线 云南旅游的最佳路线安排
如果你是第一次来云南旅游,推荐最经典的线路是:昆明→大理→丽江→泸沽湖→香格里拉。这条线路经典的经典比较多,比较集中,都是在一条线,每个地方都有机场,全国好多城市都有直飞的航班。交通也很方便,可以根据自己的时间随意搭配。

2024最适合穷游的12个地方 一个人穷游去哪里好

2024最适合穷游的12个地方 一个人穷游去哪里好
1、哈尔滨:要想体验冬季游玩乐趣的朋友,那可一定不要错过哈尔滨这座城市了,绝对是让你来了还想再来。除了好玩的滑雪、冰雕以外,其实哈尔滨也是非常适合拍照写真的,因为哈尔滨临近俄罗斯这个国家,其有的建筑也是非常有国外欧美建筑的风格。2、苏州:苏州的每一角落,都有着江南水乡的风韵。必打卡景点有:平江路:先有平江路,后有苏州城,一条历史老街,一条沿河的小路。白天就来平江路感受原汁原味的苏州。拙政园:中国四大园林之一,亭台楼阁,奇石古树,园区以水为中心,山木环绕。苏州博物馆:需要提前预约,整个博物馆宛若一座小园林。

2024桂林必去五个景点 桂林旅游必看景点

2024桂林必去五个景点 桂林旅游必看景点
来桂林旅游,漓江是必游的。漓江景区是世界上规模最大、风景最美的岩溶山水游览区,集中了桂林山水的精华。一般游漓江的主要方式有坐船、竹筏及徒步,包括漓江三星、四星游船,漓江竹筏游和兴坪渔村大船游等。

2024清明家庭旅游最佳去处 清明节去哪里玩比较好

2024清明家庭旅游最佳去处 清明节去哪里玩比较好
带着父母或者爷爷奶奶来厦门,在鼓浪屿上度过一个悠闲下午,身心都可以得到放松。厦门是很多人旅游必去的城市之一,这里有很多出名的景点,比如说鼓浪屿、中山路步行街等等。厦门位于福建省,因此这里一年四季的气候都是比较合适的。鼓浪屿是一个小岛,需要乘船上岛哦。岛上有日光岩、菽庄花园、风琴博物馆等景点,在日光岩内,可以俯视全岛,将景色尽收眼底。这里还有著明经典打卡地《最美转角》。

张家界旅游必去景区 张家界旅游景点推荐

张家界旅游必去景区 张家界旅游景点推荐
张家界旅游必去景区,指的是张家界的核心景区武陵源风景区,也就是通常所说的“张家界国家森林公园”。张家界国家森林公园和武陵源风景区其实是同一片景区,只需要买一张门票即可,可从五处门票站进景区。第二个打卡景点是天门山,通过乘坐天门山索道,你可以欣赏到绝美的风景,山顶森林和各种珍稀植物让人叹为观止。天门山景区与张家界国家森林公园不在同一个地方,门票也是分开购买的。其最著名地标是天门洞,出火车站抬头就能看到天门山索道。天门山国家森林公园内处处古树参天,藤蔓缠绕。景区分为天门洞、中线、东线和西线景区等几个主要区域。

2024重庆旅游攻略 2024年重庆旅游景点

2024重庆旅游攻略 2024年重庆旅游景点
重庆旅游住宿建议住在解放碑附近,神仙选择,地理位置优越,离各大景点都近,出行便利,公交,地铁,打车都方便,好吃的多,八一好吃街,包括一些有名的小吃都在附近。而且是商业中心,购物也方便,适合逛吃逛吃。

西安旅游攻略自由行路线推荐 第一次去西安旅游攻略

西安旅游攻略自由行路线推荐 第一次去西安旅游攻略
第一天洒金桥和西羊市吃早点,西安本地人一般选择的洒金桥和西羊市。吃完早饭步行前往钟鼓楼,鼓楼可以看到各种类型的鼓,以及一些关于鼓的背景和知识,还有一些表演。钟楼鼓楼其实都是夜景好看。下午就去碑林博物馆和西安城墙。碑林博物馆很多喜欢历史和石刻的一定要来。傍晚就去城墙,建议女孩子穿汉服,拍照很出片。晚上可以去永兴坊转转,可以在这儿吃吃逛逛。

2024昆明旅游攻略景点大全 昆明有什么好玩的地方推荐

2024昆明旅游攻略景点大全 昆明有什么好玩的地方推荐
冬天旅游的话一定要去滇池,这里会有成群的海鸥栖息在这里。拍照超级好看。3月份之后海鸥就会飞走,一定要留意时间,不要跑空。滇池周围有大小数十个山峰,在湖畔,您可以欣赏到云南民族村、云南民族博物馆、西山华亭寺、太华寺、三清阁、龙门、筇竹寺、大观楼及晋宁盘龙寺、郑和公园等风景名胜区。在滇池可以看到很多海鸥。天气特别晴朗,滇池周边的柳树摇曳,加上阳光照射,堪称为一副美景。可以去买点面包喂海鸥,抓拍几张漂亮的照片。

成都旅游必去十大景点推荐 四川成都最值得去的十大景点

成都旅游必去十大景点推荐 四川成都最值得去的十大景点
1、锦里:夜间的锦里更加热闹,人来人往的街道,水榭亭台间点缀着红红的灯笼,让夜晚的锦里更具古典韵味,十分适合拍照打卡。锦里的店铺都很有川蜀地区老房子的特色,古色古香,还可以淘到各种小玩意。2、宽窄巷子:宽窄巷子是一条清朝遗留下来的古街道,由宽巷子、窄巷子和井巷子三条古朴街道和其间院落组成。在这里还可以体验碗茶、掏耳朵、川剧变脸等特色民俗项目。可以穿汉服来,很有感觉。其实井巷子是非常有看点,而且适合拍照的一条街。

2024山西旅游必去十大景点 山西必去景点攻略地

2024山西旅游必去十大景点 山西必去景点攻略地
1、云冈石窟:中国四大石窟之一,是历史古迹类的景点。第20窟是云冈石窟的代表作,游客们游览云冈石窟都会来这里拍照留念。云冈石窟一共有四十多个洞窟,时间有限的话可以选部分来看。尤其是第五窟和第六窟。这两个洞窟非常精美,洞窟里面密密麻麻的雕像,太壮观太震撼了。比较传统的参观路线是从东部的第1窟开始,依次往西直到第45窟结束。
本文Tag