SQL系列 - SQL语句优化个人总结
关于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语句优化个人总结的更多相关文章
- [MySQL性能优化系列]LIMIT语句优化
1. 背景 假设有如下SQL语句: SELECT * FROM table1 LIMIT offset, rows 这是一条典型的LIMIT语句,常见的使用场景是,某些查询返回的内容特别多,而客户端处 ...
- Oracle sql"NOT IN"语句优化,查询A表有、B表没有的数据
记录量大的情况下,采用NOT IN查询,那肯定会慢的无法接受.比如: SELECT A.* FROM TABLE_A WHERE A.USER_ID NOT IN (SELECT B.USER_ID ...
- sql语句优化SQL Server
MS SQL Server查询优化方法查询速度慢的原因很多,常见如下几种 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了 ...
- SQL Server数据库性能优化之SQL语句篇【转】
SQL Server数据库性能优化之SQL语句篇http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 近期项目需要, 做了一 ...
- 优化数据库的方法及SQL语句优化的原则
优化数据库的方法: 1.关键字段建立索引. 2.使用存储过程,它使SQL变得更加灵活和高效. 3.备份数据库和清除垃圾数据. 4.SQL语句语法的优化.(可以用Sybase的SQL Expert,可惜 ...
- 数据库性能调优——sql语句优化(转载及整理) —— 篇2
下面是在网上搜集的一些个人认为比较正确的调优方案,如有错误望指出,定虚心改正 (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中 ...
- 数据库性能调优——sql语句优化(转载及整理) —— 篇1
一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实 ...
- 数据库性能优化之SQL语句优化
一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的编写等是体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统 ...
- SQL Server数据库性能优化(一)之 优化SQL 语句
最近工作上基本没什么需求(好吧 不是最近是好久了,所以随便看看基础的东西来填补自己的空白) 原文出自:http://www.blogjava.net/allen-zhe/archive/2010/07 ...
随机推荐
- Oracle Schema Objects(Schema Object Storage And Type)
One characteristic of an RDBMS is the independence of physical data storage from logical data struct ...
- nodejs(二)
nodejs第二章节 回调函数 Node.js 异步编程的直接体现就是回调 异步编程依托于回调来实现 例子1:http服务器回调 var http = require(“http”);//引入一个ht ...
- jquery插件网址
各种分布图的插件:http://echarts.baidu.com/demo.html
- Count the string---hdu3336(kmp Next数组的运用)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3336 题意就是求串s的前缀的个数和: 例如:abab 前缀 个数 a 2 ab 2 ab ...
- 怎样在QML应用中创建一个Context Menu
我们在非常多的系统中看见能够在屏幕的一个地方长按,然后就能够依据当前显示的上下文弹出一个菜单. 菜单中能够有一些选项,比方删除,改动该项.这样的一般在ListView或GridView中常见.今天,我 ...
- 【云安全与同态加密_调研分析(2)】国外云安全标准建议组织——By Me
国际上比较有影响力的云安全组织: ◆2. 国外云安全标准建议组织(云安全建议白皮书)◆ ◆云安全标准建议组织(主要的)◆ ◆标准建议组织介绍◆ ◆相关建议白皮书制定◆ ◆建立的相关模型参考◆ ◆备注( ...
- npm命令,查看当前npm版本,更新nmp到最新版本,安装sails
打开Node.js command prompt 1 查看npm当前版本 npm -v 2 更新npm至最新版本 npm install npm@latest -g 3 安装sails npm in ...
- mutex_lock
多核处理器下,会存在多个进程处于内核态的情况,而在内核态下,进程是可以访问所有内核数据的,因此要对共享数据进行保护,即互斥处理. mutex_lock(struct mutex *lock)和mute ...
- POJ1836:Alignment(LIS的应用)
题目链接:http://poj.org/problem?id=1836 题目要求: 给你n个数,判断最少去掉多少个数,从中间往左是递减的序列,往右是递增的序列 需注意的是中间可能为两个相同的值,如 1 ...
- 爱用bootstrap系列一:Sublime上写H5及运行
sublime上使用插件快速生成模板文件 第一,你要先下载package control的插件,这是一款用来管理插件的插件 . 可能会由于你所在的网络通过代理访问而导致安装失败,你可以通过下面的步骤来 ...