-- 定义游标。
declare
cursor aa is
select names,num from test;
beginfor bb in aa
loopif = oracle" then
end if
end loop;
end- 速度优化,前一语句不后一语句的速度快几十倍。
select names,dates
from test,b
where = and
is null and
> date(''2003-01-01'',yyyy-mm-dd'')
select names,dates
from test
where names not in ( select names
from b
where dates > to_date(''2003-01-01'',yyyy-mm-dd'')
- 查找重复记录。
select names,num
from test
where rowid !=select max(rowid)
from test b
where = and
- 查找表test中时间最新的前10条记录。
select * from (select * from test order by dates desc) where rownum < 11
- 序列号的产生。
create sequence row_id
minvalue 1
maxvalue 9999999999999999999999
start with 1
increment by 1
insert into test values(row_
oracle优化器。
oracle在执行一个sql之前,首先要分析一下语句的执行计划,然后再按执行计划去执行。分析语句的执行计划的工作是由优化器(optimizer)来完成的。不同的情况,一条sql可能有多种执行计划,但在某一时点,一定只有一种执行计划是最优的,花费时间是最少的。
相信你一定会用pl/sql developer、toad等工具去看一个语句的执行计划,不过你可能对rule、choose、first rows、all rows这几项有疑问,因为我当初也是这样的,那时我也疑惑为什么选了以上的不同的项,执行计划就变了?
1、优化器的优化方式
oracle的优化器共有两种的优化方式,即基于规则的优化方式(rule-based optimization,简称为rbo)和基于代价的优化方式(cost-based optimization,简称为cbo)。
a、rbo方式:优化器在分析sql语句时,所遵循的是oracle内部预定的一些规则。比如我们常见的,当一个where子句中的一列有索引时去走索引。
b、cbo方式:依词义可知,它是看语句的代价(cost)了,这里的代价主要指cpu和内存。优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息。
统计信息给出表的大小 、有少行、每行的长度等信息。这些统计信息起初在库内是没有的,是你在做analyze后才出现的,很多的时侯过期统计信息会令优化器做出一个错误的执行计划,因些我们应及时更新这些信息。在oracle8及以后的版本,oracle列推荐用cbo的方式。
我们要明了,不一定走索引就是优的 ,比如一个表只有两行数据,一次io就可以完成全表的检索,而此时走索引时则需要两次io,这时对这个表做全表扫描(full table scan)是最好的。
新版本的oracle逐渐抛弃对rule方式的支持,即使是rule方式,最后sql执行效率的衡量标准都是,sql执行消耗了多少资源?对代价(cost)的优化方式,需要表,索引的统计信息,需要每天多表和索引进行定时的分析,但是统计信息也是历史的,有时候也不一定是最优的,统计信息等于就是一个人的经验,根据以前的经验来判断sql该怎么执行(得到优化的sql执行路径),所以具体优化执行的时候,先手工分析sql,看是用rbo方式消耗大,还是cbo消耗大;dba的工作就是要根据当前oracle的运行日志,进行各种调整,使当前的oracle运行效率尽量达到最优。可以在运行期间,采用hint灵活地采用优化方式。
2、优化器的优化模式(optermizer mode)
优化模式包括rule,choose,first rows,all rows这四种方式,也就是我们以上所提及的。如下我解释一下:
rule:不用多说,即走基于规则的方式。 (rbo优化方式)
choolse:这是我们应观注的,默认的情况下oracle用的便是这种方式。指的是当一个表或或索引有统计信息,则走cbo的方式,如果表或索引没统计信息,表又不是特别的小,而且相应的列有索引时,那么就走索引,走rbo的方式。
在缺省情况下,oracle采用choose优化器,为了避免那些不必要的全表扫描(full table scan),你必须尽量避免使用choose优化器,而直接采用基于规则或者基于成本的优化器。
first rows:它与choose方式是类似的,所不同的是当一个表有统计信息时,它将是以最快的方式返回查询的最先的几行,从总体上减少了响应时间。 (cbo优化方式,提供一个最快的反应时间,根据系统的需求,使用情况)
all rows:也就是我们所说的cost的方式,当一个表有统计信息时,它将以最快的方式返回表的所有的行,从总体上提高查询的吞吐量。没有统计信息则走基于规则的方式。
(cbo优化方式,提供最大的吞吐量,就是使执行总量达到最大)
first rows和all rows是有冲突的。如果想最快第返回给用户,就不可能传递更多的结果,这就是first rows返回最先检索到的行(或记录);而all rows是为了尽量将所有的结果返回给用户,由于量大,用户就不会很快得到返回结果。就象空车能跑得很快,重装车只能慢慢地跑;
3、如何设定选用哪种优化模式
a、instance级别
我们可以通过在init.ora文件中设定optimizer_mode=rule、optimizer_mode=choose、optimizer_mode=first_rows、optimizer_mode=all_rows去选用3所提的四种方式,如果你没设定optimizer_mode参数则默认用的是choose这种方式。
和init.ora都在$oracle_home/dbs目录下,可以用find $oracle_home -name init*.ora查看该目录下的init文件。
是对全体实例有效的;init.ora只对指定的实例有效。
b、sessions级别
通过sql> alter session set optimizer_mode=;来设定。 将覆盖。ora设定的优化模式,也可以在sql语句中采用hint强制选定优化模式。
如下:c、语句级别
这些需要用到hint,比如:
sql> select /*rule */
4 from tf_f_yhda a,
5 tf_f_depart b
6 where
在这儿采用hint,强制采用基于规则(rule)的优化模式;
hint语法,/*开头,*/结尾,中间填写强制采用的优化模式。
4、为什么有时一个表的某个字段明明有索引,当观察一些语的执行计划确不走索引呢?如何解决呢 ?
a、不走索引大体有以下几个原因
你在instance级别所用的是all_rows的方式
你的表的统计信息(最可能的原因)
你的表很小,上文提到过的,oracle的优化器认为不值得走索引。
b、解决方法
可以修改init.ora中的optimizer_mode这个参数,把它改为rule或choose,重起数据库。也可以使用4中所提的hint.
删除统计信息
sql>analyze table table_name delete statistics;
表小不走索引是对的,不用调的。
5、其它相关
a、如何看一个表或索引是否是统计信息
sql>select * from user_tables
2 where table_name=
3 and num_rows is not null;
sql>select * from user_indexes
2 where table_name=
3 and num_rows is not null;
b、如果我们先用cbo的方式,我们应及时去更新表和索引的统计信息,以免生形不切合实的执行计划。
sql> analyze table table_name compute statistics;
sql> analyze index index_name estimate statistics;
oracle基本语法
忘了密码后。1.若名登录到oralce编缉环境 sqlplus nolog 2.集成登录到oracle 数据库 conn as sysdba 3.修改 oracle 用户的密码 alter user 用户名 identified by 密码 建表空间。create tablespace 表空间名。d...
oracle常用语法
zt oracle initialization or shutdown in progress 3 zt ora 01033 oracle initialization or shutdown in progress的解决 8 zt 解决ora 01033 oracle initializatio...
英语基本语法
语法。一 词类。1 名词 noun n.表示人或事物的名称 名词不能随便跑出来 如pen apple dog等。2 冠词 article art.用于名词前,帮助说明名词所指的人或事物,包括a an the.3 代词 pronoun pron.用于代替名词以及名词作用的短语 分句或句子等。如we t...