SQL优化快速入门
最近遇到一个专门进行SQL技术优化的项目,对很多既有的老存储过程进行调优(现在已经不再新增任何存储过程),因此系统的对SQL语句编写进行一次科学的学习变得很有必要。这儿将基于黄德承大神的Oracle SQL语句优化一书,选取其中比较实用和通用的部分进行介绍。

- 任何SQL语句,只要在where子句中实用了is null或is not null,那么Oracle优化器不会使用索引。
- 任何where子句的条件的左侧不能出现函数,否则不走索引,比如WHERE YEAR(createtime) = '2016',可以用createtime>='2016-01-01'
- 在使用通配符%的like语句中,可以通过like 'c%'使用索引
- order by语句,任何在order by语句的非索引项或者有计算表达式都将降低查询速度。
- NOT和<>,会造成不走索引,应该选择使用where price<200 or price > 100。
- IN和EXISTS,IN操作符的子查询都可以使用EXISTS代替,效率会高很多,where column in/exists (select 'X' from … where …),需要好好考虑。
Tip:
参数化SQL,like @count, '%'+ count +'%'

- 选择最优效率的表名顺序(Oracle解析器按照从右到左的顺序处理FROM子句中的表名),比如select count(*) from tab1 inner join tab2,这是优先检索表2,并将表2的数据与表1的合并。在SQL SERVER中,查看执行计划,发现并没有区别
- 减少查询的次数(包括对表查询),将多个分离的查询合并
- 能够在WHERE字句中使用的条件,尽量避免放在HAVING字句中
- 用EXISTS替代IN,用表连接替代EXISTS
- 用EXISTS替代DISTINCT,因为RDBMS会在子查询条件满足后立即返回结果
- 用索引来提高效率,定期的重构索引是有必要的
- 避免在索引列上计算
- 用>=代替>
- 注意隐式转换
- UNION-ALL替换UNION
- 在严格遵守条件的情况下(所有的列必须包含在相同的索引中并保持在索引中的排列顺序,所有的列必须定义为非空),ORDER BY子句也是可以走索引的。
SQL优化快速入门的更多相关文章
- SQL*Plus快速入门
连接数据库sqlplus hr@\"//mymachine.mydomain:port/MYDB\" --连接到MYDB数据库的一个HR数据集里sqlplus hr@MYDB -- ...
- [SQL]SQL语言入门级教材_SQL语言快速入门(五)
SQL语言快速入门(一) SQL是英文Structured Query Language的缩写,意思为结构化查询语言. SQL语言的主要功能就是同各种数据库建立联系,进行沟通.按照ANSI(美国国家标 ...
- AngularJS快速入门指南01:导言
AngularJS使用新的attributes扩展了HTML AngularJS对单页面应用的支持非常好(SPAs) AngularJS非常容易学习 现在就开始学习AngularJS吧! 关于本指南 ...
- SQL Server 性能优化之RML Utilities:快速入门(Quick Start)(1)
SQL Server 性能优化之RML Utilities:快速入门(Quick Start)(1) 安装Quick Start工具 RML(Replay Markup Language)是MS ...
- 浅谈SQL优化入门:3、利用索引
0.写在前面的话 关于索引的内容本来是想写的,大概收集了下资料,发现并没有想象中的简单,又不想总结了,纠结了一下,决定就大概写点浅显的,好吧,就是懒,先挖个浅坑,以后再挖深一点.最基本的使用很简单,直 ...
- JDBC基础:JDBC快速入门,JDBC工具类,SQL注入攻击,JDBC管理事务
JDBC基础 重难点梳理 一.JDBC快速入门 1.jdbc的概念 JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以 ...
- AngularJS快速入门指南09:SQL
我们可以将之前章节中的代码用来从数据库中读取数据. 通过PHP Server从MySQL数据库中获取数据 <div ng-app="myApp" ng-controller= ...
- BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 连接数据库执行SQL语句
BIML 101 - BIML 快速入门教程 第一节 连接数据库执行SQL语句 本小节将用BIML建一个简单的可以执行的包. 新建一个biml文件,贴入下面的代码 1 <Biml xmlns=& ...
- sql优化 性能快速定位
sql server sql性能快速定位 简介 对于写出实现功能的SQL语句和既能实现功能又能保证性能的SQL语句的差别是巨大的.很多时候开发人员仅仅是把精力放在实现所需的功能上,而忽略了其所写代码的 ...
随机推荐
- boost的编译
第1步: 先从官网(www.boost.org)下载最新版的BOOST源码,如图所示 我这里下的是zip的那个第2步:编译源代码(放心.这里是傻瓜式的操作,很容易操作)(1)先把源代码放在E盘,例如 ...
- 基于Moodle的IT课程辅助教育平台搭建
基于Moodle的IT课程辅助教育平台搭建 Moodle是一个开源课程管理系统(CMS),也被称为学习管理系统(LMS)或虚拟学习环境(VLE).它已成为深受世界各地教育工作者喜爱的一种为学生建立网上 ...
- Activity类生命周期
Activity通常就是一个单独的屏幕.每一个活动都被实现为一个独立的类,并且从活动基类中继承而来,活动类将会显示由视图控件组成的用户接口,并对事件作出响应. 从开发者角度看,Activity是一个J ...
- 如何遍历HashMap
HashMap的遍历有两种常用的方法,那就是使用keyset及entryset来进行遍历,但两者的遍历速度是有差别的 java Map 遍历速度最优解 第一种: Map map = new HashM ...
- 在Python中调用glutInit遇到OpenGL.error.NullFunctionError的解决方法
在window10 64bit + Python环境下,通过pip install PyOpenGL成功之后,无奈执行到glutInit()时候总是报错. OpenGL.error.NullFunct ...
- unity发布安卓 截图保存到本地
using System.IO; //获取系统时间并命名相片名 System.DateTime now = System.DateTime.Now; string times = now.ToStri ...
- OpenCv编程
(1)用OpenCv加载.显示.保存图片: //加载图片 IplImage* m_img;//定义IplImage格式的图片头指针: m_img=cvLoadImage(m_imgLoc);//装载m ...
- 双击防止网页放大缩小HTML5
幕双击放大或缩小.即相当于这样设置 <meta name="viewport" content="width=device-width, initial-scale ...
- 岁末年初3Q大战惊现高潮,360震撼推出Android "3Q" IM即时通讯
岁末年初3Q大战惊现高潮,360震撼推出Android "3Q" IM即时通讯 看过了QQ和360斗争的开端高潮,当然现在还不能说这场斗争已经结束,在我看来这次的事件未尝不是一个适 ...
- Win7环境下搭建Go开发环境,基于VSCode编辑器
一.在搭建的时候参考以下文章 http://www.cnblogs.com/zsy/archive/2016/02/28/5223957.html http://blog.csdn.net/hil20 ...