码迷,mamicode.com
首页 > 数据库 > 详细

数据库学习——SQL调优

时间:2016-09-29 20:38:05      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

一、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调优

标签:

原文地址:http://www.cnblogs.com/HelloMoying/p/5920622.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!