Oracle的优化器有两种优化方式(整理), 2010-04-13
RBO方式:基于规则的优化方式(Rule-Based Optimization,简称为RBO)
优化器在分析SQL语句时,所遵循的是Oracle内部预定的一些规则。比如我们常见的,当一个where子句中的一列有索引时去走索引。
CBO方式:基于代价的优化方式(Cost-Based Optimization,简称为CBO)
它是看语句的代价(Cost),这里的代价主要指Cpu和内存。优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息。统计信息给出表的大小、有少行、每行的长度等信息。这些统计信息起初在库内是没有的,是做analyze后才出现的,很多时候过期统计信息会令优化器做出一个错误的执行计划,因此应及时更新这些信息。
所以hint也不例外,除了/*+rule*/其他的都是CBO优化方式
优化模式包括Rule、Choose、First rows、All rows四种方式:
Rule:基于规则的方式。
Choose:默认的情况下Oracle用的便是这种方式。指的是当一个表或索引有统计信息,则走CBO的方式,如果表或索引没统计信息,表又不是特别的小,而且相应的列有索引时,那么就走索引,走RBO的方式。
PS: 优化模式是CHOOSE的情况下,看Cost参数是否有值来决定采用CBO还是RBO:
SELE ......
在做项目经常遇到分科室、人员进行汇总的问题,在ORACLE中对此类问题的处理相当方便!下面以项目中遇到的实例进行说明:
查询语句如下:
select f_sys_getsectnamebysectid(a.sectionid) as sectname,
--a.sectionid,
f_sys_employinfo_getnamebyno(a.buyerid) as name,
sum(c.ratio) as llratio,
sum(b.ratio) as lratio,
sum(a.ratio) as ratio,
sum(d.ratio) as nratio
from (select sectionid, buyerid, ratio
from T_PPRM_ASPPurRatio
where year = '2008') a,
(select buyerid, ratio from T_PPRM_ASPPurRatio where year = '2007') b,
(select buyerid, ratio from T_PPRM_ASPPurRatio where year = '2006') c, ......
(Oracle)rownum用法详解
2008-08-06 15:41
对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀。
(1) rownum 对于等于某值的查询条件
如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。
SQL> select rownum,id,name from student where rownum=1;(可以用在限制返回记录条数的地方,保证不出错,如:隐式游标)
SQL> select rownum,id,name from student where rownum =2;
ROWNUM ID NAME
---------- ------ ---------------------------------------------------
(2)rownum对于大于某值的查询条件
如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle 认为rownum&g ......
oracle分页???
在mysql中只要limit x,y就可以分页成功,那oracle 中是怎么做的呢?
=================================================
方法一:
SELECT id,rown
from (SELECT id, ROWNUM rown
from (SELECT id
from table
WHERE (************)
ORDER BY ********)
WHERE ROWNUM <= ......
oracle imp时报:
IMP-00032: SQL statement exceeded buffer length
IMP-00008: unrecognized statement in the export file
解决办法:
将imp语句由
imp username/userpass@oraSID file=userdb_20100325.dmp full=y
更改为:
imp username/userpass@oraSID file=userdb_20100325.dmp full=y buffer=5400000 ......
在Web开发中,从页面注入的时间一般为String类型,怎么去和Oracle中的时间进行比较
方法:
String Time;
.......// 一段代码
假设Time为页面注入String类型数据,为"2010-10-10 12:02:01"。
在写SQL语句时
String sql="select from mytable where table_time > to_date('"+Time+"','yyyy-mm-dd
hh24:mi:ss')"
;
如果先把Time 转换成 Date 类型,再去比较,会报错。
......