关于SQL语句优化方法

有些是通用的(如避免Select *);

有些不同的数据库管理系统有所区别(如Where子句顺序);

然后必须根据实际环境进行调优,因为即使是相同的数据库和表,在数据量或其他环境变化之后,SQL效率可能是不同的。所以,优化不是一蹴而就的。

 

一些总结

下面是我在工作中,主要是Oracle环境下一些常用的SQL语句优化方法,仅供参考。当然,后续可以再深入研究下SQL执行计划、索引等。

避免Select *

Selcet中每少提取一个字段,数据的提取速度就会有相应的提升。提升的速度还要看您舍弃的字段的大小来判断。应避免使用Select *。

表关联顺序

Oracle的解析器按照从右到左的顺序处理from子句中的表名,from子句中写在最后的表(基础表 driving table)将被最先处理,在from子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表。

WHERE子句中的顺序

Oracle采用自下而上的顺序解析Where子句,根据这个原理,表之间的连接必须写在其他Where条件之前,那些可以过滤掉最大数量记录的条件写在Where子句的末尾。

注:本条有一定的争议,我测试时Oracle 9i效果不如DB2 V9明显,大家作为一种解决问题的思路,请以实际数据库为准。

避免全表扫描

Where中少用NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE,它们会引起全表扫描。

用Where子句替代having子句

避免使用having子句,having只会在检索出所有记录之后才对结果集进行过滤。

exists代替in

Oracle中In子查询返回的结果不能超过1000条,使用exists为替代方案。

性能测试

目的

我在客户端中执行如下语句,通过改变表关联顺序、where条件顺序,查看所用时间的变化。可能换个环境,得出的结果会大不相同,请以实际环境为准。

数据库环境

TableA 大表(DB2 V9数据量:77763  ORACLE 9i数据量:77775)

TableB 小表(DB2 V9数据量:297  ORACLE 9i数据量:18294)

表关联顺序

自连接

小表在前,DB2 V9用时:0.015s  ORACLE 9i用时:0.329s

select count(*)
from TableB b,TableA a
WHERE b.ID=a.ID

大表在前,DB2 V9用时:0.016s  ORACLE 9i用时:0.678s

 select count(*)
from TableA a,TableB b
WHERE a.ID=b.ID

可以看到,DB2 V9下时间变化不大,ORACLE 9i相差2倍。

左连接

小表在前,DB2 V9用时:0.453s  ORACLE 9i用时:0.047s

select count(*)
from TableB b
LEFT JOIN TableA a ON b.ID=a.ID

大表在前,DB2 V9用时:0.031s  ORACLE 9i用时:0.031s

select count(*)
from TableA a
LEFT JOIN TableB b ON a.ID=b.ID

可以看到,DB2 V9下用时相差10倍以上,ORACLE 9i下变化不大。

内连接

小表在前,DB2 V9用时:0.078s  ORACLE 9i用时:0.015s

select count(*)
from TableB b
INNER JOIN TableA a ON b.ID=a.ID

大表在前,DB2 V9用时:0.016s  ORACLE 9i用时:0.016s

select count(*)
from TableA a
INNER JOIN TableB b ON a.ID=b.ID

可以看到,DB2 V9下用时相差4倍,ORACLE 9i下变化不大。

WHERE条件顺序

过滤条件在右,DB2 V9用时:0.109s  ORACLE 9i用时:0.015s

select count(*)
from TableB b,TableA a
WHERE b.ID=a.ID AND b.TYPE = ''

过滤条件在左,DB2 V9用时:0.156s  ORACLE 9i用时:0.016s

select count(*)
from TableB b,TableA a
WHERE b.TYPE =''AND b.ID=a.ID

DB2 V9用时变化1/3,当条件比较多,数据量比较大时,会更加明显。

SQL系列 - SQL语句优化个人总结的更多相关文章

  1. [MySQL性能优化系列]LIMIT语句优化

    1. 背景 假设有如下SQL语句: SELECT * FROM table1 LIMIT offset, rows 这是一条典型的LIMIT语句,常见的使用场景是,某些查询返回的内容特别多,而客户端处 ...

  2. Oracle sql"NOT IN"语句优化,查询A表有、B表没有的数据

    记录量大的情况下,采用NOT IN查询,那肯定会慢的无法接受.比如: SELECT A.* FROM TABLE_A WHERE A.USER_ID NOT IN (SELECT B.USER_ID ...

  3. sql语句优化SQL Server

    MS   SQL   Server查询优化方法查询速度慢的原因很多,常见如下几种 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)          2.I/O吞吐量小,形成了 ...

  4. SQL Server数据库性能优化之SQL语句篇【转】

    SQL Server数据库性能优化之SQL语句篇http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 近期项目需要, 做了一 ...

  5. 优化数据库的方法及SQL语句优化的原则

    优化数据库的方法: 1.关键字段建立索引. 2.使用存储过程,它使SQL变得更加灵活和高效. 3.备份数据库和清除垃圾数据. 4.SQL语句语法的优化.(可以用Sybase的SQL Expert,可惜 ...

  6. 数据库性能调优——sql语句优化(转载及整理) —— 篇2

    下面是在网上搜集的一些个人认为比较正确的调优方案,如有错误望指出,定虚心改正 (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中 ...

  7. 数据库性能调优——sql语句优化(转载及整理) —— 篇1

    一.问题的提出                    在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实 ...

  8. 数据库性能优化之SQL语句优化

    一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的编写等是体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统 ...

  9. SQL Server数据库性能优化(一)之 优化SQL 语句

    最近工作上基本没什么需求(好吧 不是最近是好久了,所以随便看看基础的东西来填补自己的空白) 原文出自:http://www.blogjava.net/allen-zhe/archive/2010/07 ...

随机推荐

  1. Oracle Schema Objects(Schema Object Storage And Type)

    One characteristic of an RDBMS is the independence of physical data storage from logical data struct ...

  2. nodejs(二)

    nodejs第二章节 回调函数 Node.js 异步编程的直接体现就是回调 异步编程依托于回调来实现 例子1:http服务器回调 var http = require(“http”);//引入一个ht ...

  3. jquery插件网址

    各种分布图的插件:http://echarts.baidu.com/demo.html

  4. Count the string---hdu3336(kmp Next数组的运用)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3336 题意就是求串s的前缀的个数和: 例如:abab 前缀 个数 a     2 ab    2 ab ...

  5. 怎样在QML应用中创建一个Context Menu

    我们在非常多的系统中看见能够在屏幕的一个地方长按,然后就能够依据当前显示的上下文弹出一个菜单. 菜单中能够有一些选项,比方删除,改动该项.这样的一般在ListView或GridView中常见.今天,我 ...

  6. 【云安全与同态加密_调研分析(2)】国外云安全标准建议组织——By Me

    国际上比较有影响力的云安全组织: ◆2. 国外云安全标准建议组织(云安全建议白皮书)◆ ◆云安全标准建议组织(主要的)◆ ◆标准建议组织介绍◆ ◆相关建议白皮书制定◆ ◆建立的相关模型参考◆ ◆备注( ...

  7. npm命令,查看当前npm版本,更新nmp到最新版本,安装sails

    打开Node.js command prompt 1 查看npm当前版本 npm -v 2 更新npm至最新版本 npm install npm@latest -g 3 安装sails  npm in ...

  8. mutex_lock

    多核处理器下,会存在多个进程处于内核态的情况,而在内核态下,进程是可以访问所有内核数据的,因此要对共享数据进行保护,即互斥处理. mutex_lock(struct mutex *lock)和mute ...

  9. POJ1836:Alignment(LIS的应用)

    题目链接:http://poj.org/problem?id=1836 题目要求: 给你n个数,判断最少去掉多少个数,从中间往左是递减的序列,往右是递增的序列 需注意的是中间可能为两个相同的值,如 1 ...

  10. 爱用bootstrap系列一:Sublime上写H5及运行

    sublime上使用插件快速生成模板文件 第一,你要先下载package control的插件,这是一款用来管理插件的插件 . 可能会由于你所在的网络通过代理访问而导致安装失败,你可以通过下面的步骤来 ...