数据库学习——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’查询时,则查询优化器不会选用索引,而采用全表扫描。

时间: 2024-08-04 00:53:03

数据库学习——SQL调优的相关文章

SQL调优

# 问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一.系统优化中一个很重要的方面就是SQL语句的优 化.对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的 SQL语句,提高系统的可用性. 在多数情况下,Oracle

基于SQLServer2008的SQL调优(转)

1. 前言 SQL是程序设计人员与数据库进行沟通的标准语言,在数据库应用程序中,使用最多的访问数据库的方法就是SQL语言.SQL性能的调整涉及到SQLServer 2008的方方面面,优化器的选择.内存参数的设定.SQL语句的写法等.本文主要从SQL语句的优化方面进行阐述,给出了一些可行的调整数据库应用性能的策略与方法,并以SQLServer 2008为平台对列举规则给予了验证. 2. 实验环境 硬件环境:Inter(R) Core(TM)2 Duo CPU P7450 @2.12GHz .2G

SQL调优日志--内存问题

SQL调优日志--内存问题排查入门篇 概述 很多系统的性能问题,是由内存导致的.内存不够会导致页面频繁换入换出,IO队列高,进而影响数据库整体性能. 排查 内存对数据库性能非常重要.那么我当出现问题的时候,我们怎么排查性能问题呢? 存在问题 主要查看2个部分.页生命周期 Page Life Expectancy,和  lazy writer /sec. 页生命周期 的参考值在很久很久以前,很多同学可能看到过,建议值是300s.但是这是基于32位操作系统,最大只能使用4GB内存给出的. Jonat

Oracle SQL 调优健康检查脚本

Oracle SQL 调优健康检查脚本 我们关注数据库系统的性能,进行数据库调优的主要工作就是进行SQL的优化.良好的数据架构设计.配合应用系统中间件和写一手漂亮的SQL,是未来系统上线后不出现致命性能问题的有力保证. 在CBO时代,一个SQL的执行计划是多样的.影响执行计划的因素也从过去RBO时代的SQL书写规则变为综合性因素.这为我们生成更加优秀执行计划提供了基础,同时也给我们进行调优带来的很多麻烦. 目前我们通常的做法,是通过AWR报告或者调试手段,发现某某SQL有问题,之后从Librar

11g新特性-自动sql调优(Automatic SQL Tuning)

11g新特性-自动sql调优(Automatic SQL Tuning) 在Oracle 10g中,引进了自动sql调优特性.此外,ADDM也会监控捕获高负载的sql语句. 在Oracle 11g中,通过运行sql tuning advisor加强了自动sql调优功能.默认情况下是每天夜间通过自动任务的方式运行"自动sql调优". 自动sql调优的过程: 1.识别需要调优的sql语句  根据AWR中的CPU和I/O负载来识别 2.调优,生成新的sql profile 在维护窗口(mai

SQL调优常用方法

在使用DBMS时经常对系统的性能有非常高的要求:不能占用过多的系统内存和 CPU资源.要尽可能快的完成的数据库操作.要有尽可能高的系统吞吐量.如果系统开发出来不能满足要求的所有性能指标,则必须对系统进行调整,这个工作被称为调优.绝定DBMS的性能的因素有两个因素:硬件和软件.使用频率高的CPU.使用多处理器.加大内存容量.增加Cache.提高网络速度等这些都是非常有效的硬件调优方式,不过对硬件进行调优对系统性能的提高是有限的,如果有非常好的硬件条件但是如果编写的SQL质量非常差的话系统的性能并不

oracle sql调优集

************************************************************ 1.新建调优集对象 ************************************************************ ---授权 grant ADMINISTER ANY SQL TUNING SET to scott; ---删除存在的STS BEGIN DBMS_SQLTUNE.DROP_SQLSET( sqlset_name => 'OCPYAN

Sybase数据库应用系统调优的五大领域

Sybase数据库应用系统调优的五大领域 2011/3/14/13:49来源:慧聪it网 本 文以“某大型商业银行的网上银行系统”这一很具有典型意义的企业级大型Sybase数据库应用系统为例,涉及了数据库应用系统调优的五大领域:压力测试. 应用端调优.服务器端调优.系统平台层的优化.应用架构的优化,详细介绍了作者在项目开发过程中曾经遇到的各种问题及其解决办法.本文通过对“企业级 Sybase数据库应用系统的性能调优的最佳实践”的探讨,从而为这类性质的工作提供了具有普遍指导意义的参考. 1.项目背

SQL调优日记--并行等待的原理和问题排查

原文:SQL调优日记--并行等待的原理和问题排查 概述 今天处理项目,客户反应数据库在某个时间段,反应特别慢.需要我们提供一些优化建议. 现象 由于是特定的时间段慢,排查起来就比较方便.直接查看这个时间段数据库的等待情况.查看等待类型发现了大量的CXPAKET等待类型且等待时间长. 有的看官可能知道,出现这个等待类似时,可以适当降低最大并行度来解决.但是为什么这么做呢?降低并行度就一定可以解决问题吗? CXPAKET原理 那什么是CXPAKET 等待呢. 当数据库引擎分析查询的开销超过设定的阀值