`

SQL性能优化-持续更新中。。。。。。

    博客分类:
  • SQL
阅读更多
1 通过ROWID访问表--索引
你可以采用基于ROWID的访问方式情况,提高访问表的效率, , ROWID包含了表中记录的物理位置信息..ORACLE采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系. 通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高.

2 共享SQL语句--相同的sql放入缓存

3 选择最有效率的表名顺序(只在基于规则的优化器中有效)  最右边的表作为基础表(记录最少,效率最高)
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.当ORACLE处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并.
例如:
表 TAB1 16,384 条记录
表 TAB2 1 条记录

选择TAB2作为基础表 (最好的方法)
select count(*) from tab1,tab2 执行时间0.96秒

选择TAB2作为基础表 (不佳的方法)
select count(*) from tab2,tab1 执行时间26.09秒

如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.
例如:
EMP表描述了LOCATION表和CATEGORY表的交集.
SELECT *
FROM LOCATION L ,
CATEGORY C,
EMP E
WHERE E.EMP_NO BETWEEN 1000 AND 2000
AND E.CAT_NO = C.CAT_NO
AND E.LOCN = L.LOCN
将比下列SQL更有效率
SELECT *
FROM EMP E ,
LOCATION L ,
CATEGORY C
WHERE E.CAT_NO = C.CAT_NO
AND E.LOCN = L.LOCN
AND E.EMP_NO BETWEEN 1000 AND 2000

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

5 用EXPLAIN PLAN 分析SQL语句
EXPLAIN PLAN 是一个很好的分析SQL语句的工具,它甚至可以在不执行SQL的情况下分析语句. 通过分析,我们就可以知道ORACLE是怎么样连接表,使用什么方式扫描表(索引扫描或全表扫描)以及使用到的索引名称.

6.分页sql
一般的分页sql如下所示:
sql1:select * from (select t.*,rownum rn from XXX t)where rn>0 and rn <10;
sql2:select * from (select t.*,rownum rn from XXX t where rownum <10)where rn>0;
乍看一下没什么区别,实际上区别很大...125万条数据测试,
sql1平均需要1.25秒(咋这么准呢? )
sql2平均需要... 0.07秒
原因在于,子查询中,sql2排除了10以外的所有数据
当然了,如果查询最后10条,那效率是一样的

7.多Exists,少in
Exists只检查存在性,性能比in强很多,有些朋友不会用Exists,就举个例子
例,想要得到有电话号码的人的基本信息,table2有冗余信息
select * from table1;--(id,name,age)
select * from table2;--(id,phone)
in:
select * from table1 t1 where t1.id in (select t2.id from table2 t2 where t1.id=t2.id);
Exists:
select * from table1 t1 where Exists (select 1 from table2 t2 where t1.id=t2.id);

(补充内容)用in的朋友注意了,当参数超过1000个,数据库就挂了。(oracle 10g数据库)

8.少用*
很多朋友很喜欢用*,比如:select * from XXX;
一般来说,并不需要所有的数据,只需要一些,有的仅仅需要1个2个,
拿5W的数据量,10个属性来测试:
(这里的时间指的是PL/SQL Developer显示所有数据的时间)
使用select * from XXX;平均需要20秒,
使用select column1,column2 from XXX;平均需要12秒
(我的机子不是很好。。。)
对于开发来说,这一条是个灾难,知道是一回事,做就是另一回事了

9 一些查询往往会联接十几张甚至几十张表

应用设计的时候对这样的查询要很慎重。如果表格很大,十几张表做联接,肯定不会有好的性能。如果应用是支持数据分析系统,那可能还好。如果应用是一个OLTP系统(要求很快返回结果),这样的设计失败的风险可能会很大。有时候可能需要降低数据库范式级别,多保存一些冗余数据列,以减少表格联接的数量

10 慎用distinct关键字

distinct在查询一个字段或者很少字段的情况下使用,会避免重复数据的出现,给查询带来优化效果。

但是查询字段很多的情况下使用,则会大大降低查询效率。因为当查询很多字段时,如果使用distinct,数据库引擎就会对数据进行比较,过滤掉重复数据,然而这个比较,过滤的过程则会毫不客气的占用系统资源,cpu时间。

11 like

去掉前置百分号。like语句会因为前置百分号而无法使用索引

12 使用存储过程

可以考虑使用存储过程封装那些复杂的SQL语句或商业逻辑,这样做有几个好处。
一是存储过程的执行计划可以被缓存在内存中较长时间,减少了重新编译的时间。
二是存储过程减少了客户端和服务器的繁复交互。
三是如果程序发布后需要做某些改变你可以直接修改存储过程而不用修改程序,避免需要重新安装部署程序。

13 复杂sql

对于非常复杂的sql(特别是有多层嵌套,带子句或相关查询的),应该先考虑是否设计不当引起的。对于一些复杂SQL可以考虑使用程序实现。

14 避免In子句

使用In 或 not In子句时,特别是当子句中有多个值时,且查询数据表数据较多时,速度会明显下降。可以采用连接查询或外连接查询来提高性能。

15 批量插入数据   insert into  select  提高性能

16 sys_guid()  ,sysdate,序列sequence

17 上亿数据量数据库优化

避免全表扫描,使用存储过程,建立临时表,其他一些查询条件调优不赘述
7
5
分享到:
评论
1 楼 kingcs 2015-03-27  
very good  

相关推荐

    SQL_SERVER_2008_DBA入门经典 NO.4

    《SQL Server 2008 DBA入门经典》在概述了SQL Server管理工具和数据库组件后,介绍了如何安装和配置系统、配置和管理网络通信以及自动化管理任务,并深入探究丁业务持续性策略、性能监视和优化。另外,《SQLServer ...

    SQL_SERVER_2008_DBA入门经典 NO.2

    《SQL Server 2008 DBA入门经典》在概述了SQL Server管理工具和数据库组件后,介绍了如何安装和配置系统、配置和管理网络通信以及自动化管理任务,并深入探究丁业务持续性策略、性能监视和优化。另外,《SQLServer ...

    SQL_SERVER_2008_DBA入门经典 NO.3

    《SQL Server 2008 DBA入门经典》在概述了SQL Server管理工具和数据库组件后,介绍了如何安装和配置系统、配置和管理网络通信以及自动化管理任务,并深入探究丁业务持续性策略、性能监视和优化。另外,《SQLServer ...

    Hadoop平台中SQL优化的四个思路

    要正确的优化SQL,必须能快速定位性能瓶颈点,或者说快速找到SQL主要的开销所在。慢的设备通常是瓶颈点的成因,如文件下载时的瓶颈点可能是网络速度,本地文件复制时的瓶颈点可能在于硬盘性能。  为了快速找到SQL...

    MySQL的安装配置 及 配置,服务管理,基本使用,性能优化,安全性,监控与日志管理,扩展与高可用,备份与恢复,版本升级与迁移

    mysql安装配置教程 ...通过掌握性能优化、安全性、监控与日志管理、扩展与高可用、备份与恢复以及版本升级与迁移等方面的知识,你可以更好地管理MySQL数据库,确保其稳定、高效地运行,并满足业务的需求。

    ORM_SQLSugar

    1、高性能 ,不夸张的说,去掉Sql在数据库执行的时间,SqlSugar是EF数倍性能,另外在批量操作和一对多查询上也有不错的SQL优化 2、高扩展性 ,支持自定义拉姆达函数解析、扩展数据类型、支持自定义实体特性,外部...

    03开源NewSql数据库TiDB-Deep Dive into TiDB

    1.0 版本已经从基于规则的查询优化器转向基于代价的查询优化器,但是还不够完善,在 2.0 版本中,一方面优化统计信息的精确度以及更新及时程度,另一方面提升 SQL 优化器的能力,对查询代价的估算更加精准、对复杂...

    易语言NetDB数据库操作中间件

    2、**网盘上传优化,暂还不支持续传。 3、**优化部分读数据库语句。 ================ [2020-1-11日] ================ 1、**修正网盘下载大文件问题。 2、**下载文件可以不设置下载路径了,系统在本目录自动创建...

    2020易语言模块大全持续更新1.zip

    常用软件性能优化模块.ec 弹出下载窗口.ec 弹出网页广告.ec 成组随机数.ec 打印数据1.20-绿营.ec 打印模块.ec 打印预览1.1.ec 打印预览1.3.ec 打印预览1.33.ec 打印预览2.41(注册表配置).ec 打印预览2.42(外部文件...

    Java毕业设计-JAVA+SQL离散数学题库管理系统(源代码+论文+外文翻译).rar

    本系统具有良好的扩展性和可定制性,开发者可以根据实际需求进行二次开发,如添加新的功能模块、优化系统性能等。同时,系统提供详细的文档和示例代码,帮助开发者快速上手和定制开发。 **适用场景:** 本系统适用...

    基于原生PHP7.4编写的动态博客系统,大二PHP动态网页设计期末作品,包含SQL脚本与数据库文件。.zip

    PHP(全称:...总的来说,PHP作为一种成熟的Web开发语言,凭借其易用性、灵活性、丰富的库与框架支持、强大的社区生态以及持续的性能优化,成为了构建各类动态网站、Web应用及API服务的理想选择。

    SqlSugar-SqlSugar5.zip

    1、高性能 ,不夸张的说,去掉Sql在数据库执行的时间,SqlSugar是EF数倍性能,另外在批量操作和一对多查询上也有不错的SQL优化 2、高扩展性 ,支持自定义拉姆达函数解析、扩展数据类型、支持自定义实体特性,外部...

    2020易语言模块大全持续更新3.zip

    网络性能优化模块.ec 网络控件模块 1.0.ec 网络控件模块.ec 网络文件模块2.0.ec 网络时间验证.ec 网络服务器模块.ec 网页操作类(光庆版2.0).ec 网页操作类(光庆版3.0).ec 网页操作类.ec 网页操作类3.0_光庆版.ec 置...

    MySQLMTOP数据库监控工具 2.2.zip

    监视实时查询性能,查看执行统计信息,筛选和定位导致性能下降的SQL代码。结合使用Information Schema可直接从MySQL服务器收集数据,无需额外的软件或配置。 7.性能监视 监视影响MySQL性能的主要指标。如查询缓存...

    MySQL数据库优化思路的细节分析(性能方向)

    不要听信你看到的关于优化的“绝对真理”,而应该是在实际的业务场景下通过测试来验证你关于执行计划以及响应时间的假设。 本篇文章只是给大家提供一些优化方面的方向和思路,...稳定性和业务可持续性,通常比性能更重要

    这是网站版的电商系统,是Shop-for-iOS的服务端代码.zip

    ... ...这种特性使得开发者能够轻松地...总的来说,PHP作为一种成熟的Web开发语言,凭借其易用性、灵活性、丰富的库与框架支持、强大的社区生态以及持续的性能优化,成为了构建各类动态网站、Web应用及API服务的理想选择。

    01开源NewSql数据库TiDB Introduction (Feb 2018)

    OLAP 性能优化 TiDB 2.0 版本重构了 SQL 优化器和执行引擎,希望能尽可能快的选择最优查询计划并且尽可能高效地执行查询计划。 1.0 版本已经从基于规则的查询优化器转向基于代价的查询优化器,但是还不够完善,在 ...

    hyperf-iot 是基于 Hyperf v2.1+VUE Primen 开发的号卡分销系统.zip

    号卡系统,物联网卡系统,saas云端智能架构,实现的高性能(PHP协程、PHP微服务)、高灵活性、前后端分离(后台),PHP 持久化框架,助力管理系统敏捷开发,长期持续更新中。 PHP(全称:PHP: Hypertext Preprocessor)...

Global site tag (gtag.js) - Google Analytics