关于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. Python: 使用pip升级所有包

    pip 当前内建命令并不支持升级所有已安装的Python模块. 列出当前安装的包:  pip list 列出可升级的包:  pip list --outdate 升级一个包:  pip install ...

  2. gdb常见命令(未完,待续)

    // 编译文件时,带参-g > gcc -g test.c // 进入gdb调试界面 > gdb a.out 或者 > gdb > file a.out // 查看文件内容 & ...

  3. Hadoop伪分布安装详解(五)

    目录: 1.修改主机名和用户名 2.配置静态IP地址 3.配置SSH无密码连接 4.安装JDK1.7 5.配置Hadoop 6.安装Mysql 7.安装Hive 8.安装Hbase 9.安装Sqoop ...

  4. Socket连接何时需要断开

    socket连接没有正常断开,导致无法下次无法进行连接.

  5. (转)聊聊Servlet、Struts1、Struts2以及SpringMvc中的线程安全

    前言 很多初学者,甚至是工作1-3年的小伙伴们都可能弄不明白?servlet Struts1 Struts2 springmvc 哪些是单例,哪些是多例,哪些是线程安全? 在谈这个话题之前,我们先了解 ...

  6. 使用Custom Draw优雅的实现ListCtrl的重绘

    common control 4.7版本介绍了一个新的特性叫做Custom Draw,这个名字显得模糊不清,让人有点摸不着头脑,而且MSDN里也只给出了一些如风的解释和例子,没有谁告诉你你想知道的,和 ...

  7. 网络爬虫之scrapy框架设置代理

    前戏 os.environ()简介 os.environ()可以获取到当前进程的环境变量,注意,是当前进程. 如果我们在一个程序中设置了环境变量,另一个程序是无法获取设置的那个变量的. 环境变量是以一 ...

  8. maven加载第三方jar包

    <dependency> <groupId>com.yeepay</groupId> <artifactId>yop-sdk</artifactI ...

  9. DevExpress控件学习总结

    1.Navigation & Layout 1.1 Bar Manager 如果想在窗体或用户控件(user control)上添加工具条(bars)或弹出菜单(popup menus),我们 ...

  10. class-dump安装与使用

    简介 class-dump is a command-line utility for examining the Objective-C segment of Mach-O files. It ge ...