`
frank1998819
  • 浏览: 731048 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类

Oracle 优化(一)转

 
阅读更多
  1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
          2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
                select id from t where num is null
             可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
             select id from t where num=0
         3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
    4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
    select id from t where num=10 or num=20
    可以这样查询:
    select id from t where num=10
    union all
    select id from t where num=20
    5.in 和 not in 也要慎用,否则会导致全表扫描,如:
    select id from t where num in(1,2,3)
    对于连续的数值,能用 between 就不要用 in 了:
    select id from t where num between 1 and 3
    6.下面的查询也将导致全表扫描:
    select id from t where name like '%abc%'
    若要提高效率,可以考虑全文检索。
    7.如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
    select id from t where num=@num
    可以改为强制查询使用索引:
    select id from t with(index(索引名)) where num=@num
    8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
    select id from t where num/2=100
    应改为:
    select id from t where num=100*2
    9.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
    select id from t where substring(name,1,3)='abc'--name以abc开头的id
    select id from t where datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’生成的id
    应改为:
    select id from t where name like 'abc%'
    select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'
    10.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
    11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
    12.不要写一些没有意义的查询,如需要生成一个空表结构:
    select col1,col2 into #t from t where 1=0
    这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:
    create table #t(...)
    13.很多时候用 exists 代替 in 是一个好的选择:
    select num from a where num in(select num from b)
    用下面的语句替换:
    select num from a where exists(select 1 from b where num=a.num)
    14.并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。
15.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
    16.应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。
    17.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
    18.尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
    19.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
    20.尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。
    21.避免频繁创建和删除临时表,以减少系统表资源的消耗。
    22.临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。
    23.在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。
    24.如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。
    25.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。
    26.使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。
    27.与临时表一样,游标并不是不可使用。对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。
    28.在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。
    29.尽量避免大事务操作,提高系统并发能力。
    30.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。



1,在time字段上建立索引(单列索引最好,至少是time为前导列)
2,保证给定参数time1 & time2跟表中time字段的类型一致
3,确保执行计划中使用了time上的索引,如果没有,使用hint强制使用
select /*+ index(t1 index_time)*/ * from t1
where time between time1 and time2;


/******************************************************************************/

第二章:索引

1,索引
与表关联的可选结构
加快SQL语句的执行
减少磁盘I/O
CREATE INDEX 语句用于创建索引
在逻辑上和物理上独立于表中的数据
ORCALE自动维护索引

2,唯一索引
确保在定义索引的列中没有重复的值
ORACLE自动为主键列和唯一键列创建唯一索引
CREATE UNIQUE INDEX 语句用于创建唯一索引

//创建唯一索引的语法 CREATE UNIQUE INDEX index_name on table_name(column_name);
//例:
SQL> create unique index idx_stuId on student(studentid);

3:组合索引
在表的多个列上创建的索引
也称为“连接索引”
组合索引中的列可以按任意顺序排列
对于在WHERE子句中包含多个列的查询,可以提高数据访问速度

//创建组合索引的语法 CREATE INDEX index_name on table_name(cloumns_list);

//例:
SQL> create index idx_empNoAndDeptNo on emp(empNo,deptNo);
//在WHERE子句中同时已这两列为条件时,将引用到这个索引
SQL> select * from emp where empNo=7899 and deptNo=10;

4:反向键索引
适合于只做添加不做修改的列
反转索引列中的没一个字节(如:001,002 分别反转为 100,200)
将数据插入操作分布在整个索引上
在创建索引时使用REVERSE关键字

//创建反向键索引的语法 CREATE INDEX index_name on table_name(column_name) REVERSE;
//例:
SQL> create index idx_studentId on student(studentId) REVERSE;

5,位图索引
适合于有大量重复数据的列,(例如员工表的部门编号列,部门编号大量重复)
为低基数列创建
BITMAP INDEX 语句用于创建位图索引
优点:减少响应时间,降低空间占用

//创建位图索引的语法 CREATE BITMAP INDEX index_name on table_name(column_name);

//例:
SQL> create bitmap index idx_deptNo on emp(deptNo);

6,索引组织表
表的数据存储在与其关联的索引中
对于数据的修改只会导致对索引的更新
基于主键进行搜索(所以表中必须要定义主键列)

//创建索引组织表的语法
CREATE TABLE table_name
(
colName colDataType,
……
CONSTRAINT pk_id PRIMARY KEY (table_pkcolumn)
) ORGANIZATION INDEX;
//例:
SQL> create table citys
2 (
3 nCityCode number(10),
4 vCityName varchar2(50),
5 constraint pk_citycode primary key (nCityCode)
6 ) organization index;

7,普通表与索引组织表的对比
普通表 索引组织表
ROWID唯一地标识行 主键唯一的标识行
有隐式的ROWID列 没有隐式的ROWID列
基于ROWID的访问 基于主键的访问

顺序扫描返回所有的行 完全索引扫描返回所有行,并按主键顺序排列
普通表可以存储在簇中 索引组织表不能存储在簇中
支持分发、复制、分区 不支持分发、复制、分区

8,基于函数的索引
基于一个或多个列上的函数或表达式创建的索引
表达式中不能包含聚合函数(SUM、COUNT、AVG、MIN、MAX)
不能在LOB、REF或潜逃表列上创建

//例:创建基于函数的索引
SQL> conn system/manager; //不清楚为什么scott帐户没有权限创建基于函数的索引
SQL> create index idx_cityName on scott.citys(lower(vCityName));
//在今后的SELECT语句WHERE子句中 使用lower(vCityName) 条件时,就自动引用了上面的索引

9,键压缩索引
将索引键拆分为前缀项和后缀项
在一个索引块中,通过后缀项共享前缀项即可达到压缩的目的
节省磁盘空间

//创建键压缩索引的语法 CREATE INDEX index_name table_name(前缀项列,后缀项列) COMPRESS 压缩的列序号;
//例: job(职位)列中有大量重复数据,则压缩job(职位)列,即第1列
SQL> create index idx_emp on emp(job,ename) compress 1;

10,分区索引
索引存储在不同的分区中
分区索引的类型
本地前缀索引
本地无前缀索引
全局索引
全局前缀索引
全局无前缀索引

关闭和启动Oracle的几种方法总结

关闭和启动Oracle的几种方法总结

关闭和启动Oracle的几种方法总结
有以下几种启动方式:

1、startup nomount
非安装启动,这种方式启动下可执行:重建控制文件、重建数据库
读取init.ora文件,启动instance,即启动SGA和后台进程,这种启动只需要init.ora文件。
 

2、startup mount dbname
安装启动,这种方式启动下可执行:
  数据库日志归档、
  数据库介质恢复、
  使数据文件联机或脱机,
  重新定位数据文件、重做日志文件。

  执行“nomount”,然后打开控制文件,确认数据文件和联机日志文件的位置,
  但此时不对数据文件和日志文件进行校验检查。


3、startup open dbname
先执行“nomount”,然后执行“mount”,再打开包括Redo log文件在内的所有数据库文件,
  这种方式下可访问数据库中的数据。


4、startup
等于以下三个命令
     startup nomount
     alter database mount
     alter database open


5、startup restrict
约束方式启动
  这种方式能够启动数据库,但只允许具有一定特权的用户访问
  非特权用户访问时,会出现以下提示:
     ERROR:
     ORA-01035 ORACLE 只允许具有 RESTRICTED SESSION 权限的用户使用


6、startup force
  强制启动方式
  当不能关闭数据库时,可以用startup force来完成数据库的关闭
  先关闭数据库,再执行正常启动数据库命令


7、startup pfile=参数文件名
带初始化参数文件的启动方式
  先读取参数文件,再按参数文件中的设置启动数据库
  例:startup pfile=EOracleadminoradbpfileinit.ora


8、startup EXCLUSIVE

有三种关闭方式:
1、shutdown normal

正常方式关闭数据库。


2、shutdown immediate
  立即方式关闭数据库。
  在SVRMGRL中执行shutdown immediate,数据库并不立即关闭,
  而是在Oracle执行某些清除工作后才关闭(终止会话、释放会话资源),
  当使用shutdown不能关闭数据库时,shutdown immediate可以完成数据库关闭的操作。


3、shutdown abort
直接关闭数据库,正在访问数据库的会话会被突然终止,
  如果数据库中有大量操作正在执行,这时执行shutdown abort后,重新启动数据库需要很长时间
分享到:
评论

相关推荐

    Oracle优化Oracle优化

    Oracle优化Oracle优化Oracle优化Oracle优化Oracle优化Oracle优化

    基于成本的oracle优化法则中文版.rar

    基于成本的oracle优化法则中文版 基于成本的oracle优化法则中文版

    Oracle优化日记:一个金牌DBA的故事 白鳝.扫描版

    《Oracle优化日记:一个金牌DBA的故事》是一本介绍Oracle数据库优化方法的书,以一个实际的大型优化项目为原型,用日记的形式记录了一个优化小组的DBA 如何从纷繁的头绪中找到突破口,进而完成了一个看似不可能完成...

    Oracle优化原则整理

    Oracle优化原则整理,里面主要是整理了一些写Oracle SQL 基本的优化方式~~

    基于成本的ORACLE优化法则 英文原版

    基于成本的Oracle优化法则,作者:刘易斯, ★数据库领域的超级畅销书,世界级Oracle 大师Jonathan Lewis的最新力作! ★荣获2006年年度Oracle杂志编辑选择大奖!

    Oracle优化日记:一个金牌DBA的故事 第一部

    本书是一本介绍oracle数据库优化方法的书,以一个实际的大型优化项目为原型,用日记的形式记录了一个优化小组的dba 如何从纷繁的头绪中找到突破口,进而完成了一个看似不可能完成的任务的历程。在日记之间,作者还...

    基于成本的oracle优化

    oracle优化技巧oracle优化技巧oracle优化技巧oracle优化技巧

    ORACLE优化设计方案

    ORACLE优化的设计方案,前辈dba经验的总结。

    Oracle数据库优化详解

    其中主要包括收集数据库统计系统、收集列直方图、分析SQL执行计划、如何让CBO优化器选择最优的执行计划,以及如何使用Hint提示认为改变CBO优化器的执行计划等,希望此文档能够帮助大家更深入地理解Oracle优化!

    Oracle优化打包下载

    优化笔记 sql性能的调整-总结 SQL代码性能优化 Oracle语句优化53个规则详解 ORACLE9i优化设计与系统调整 oracle9i优化器介绍 oracle9i的查询优化 ……

    oracle优化-SQL优化

    oracle优化 SQL优化 嘞哥Oracle数据优化的集合 分享

    Oracle优化常用概念.pptx

    Oracle优化常用概念.pptx

    oracle优化建议34条

    oracle优化建议34条,只要是针对索引的建议,值得一观

    oracle优化规则总汇

    oracle优化规则总汇,详细全面 oracle优化规则总汇,详细全面 oracle优化规则总汇,详细全面

    oracle优化方法总结

    常用的oracle优化方法,希望对大家有帮助

    oracle优化培训资料

    该培训资料中包括5大内容块: 1&gt;Oracle分区技术及大数据量操作性能优化 2&gt;Oracle性能问题一般解决思路 3&gt;Oracle常用hint 4&gt;Oracle动态图 5&gt;Oracle执行计划和SQL调优

    玩转AWR oracle优化

    使用awr处理oracle资源占用问题,清晰处理sql问题。使用oracle裸数据进行优化。

    ORACLE SQL性能优化系列

    ORACLE SQL性能优化系列 ORACLE SQL性能优化系列 ORACLE SQL性能优化系列

    Oracle优化器介绍

    Oracle优化器的概念、工作原理和使用方法,兼顾了Oracle8i、9i以及最新的10g三个版本。理解本文将有助于您更好的更有效的进行SQL优化工作。

Global site tag (gtag.js) - Google Analytics