数据库学习——SQL调优

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库学习——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调优的主要内容,如果未能解决你的问题,请参考以下文章

Spark学习之路 SparkCore的调优之开发调优[转]

GaussDB精品课第9期数据库设计之SQL优化

Day809.MySQL调优之SQL语句 -Java 性能调优实战

SQL查询性能调优--如何使查询更快

Spark SQL 性能调优

关于数据库性能调优心得