delete statistics 删除统计信息
今天一个sql语句很奇怪,统计信息以后,表竟然走全表扫描。后来没有办法我只得删除统计信息。exec dbms_stats.delete_table_stats('missh','cancel_orderln');删除统计信息很容易:两个参数表的“宿主”,和“表名”,两个参数都用单引号'' sql具体语句如下:SELECT ORDDATE, A.ORDNO,
RBO:hint 使用方法
两个表采用hint写法/*+index(t1 ind_t1_name) index(t2 ind_t2_name)*/t1,t2表明,ind_t1_name,ind_t2_name索引名一个表/*+index(t1 ind_t1_name) */走rule/*+RULE */[@more@]
index desc:消除排序优化
很多查询,由于用户要求,会在查询中使用order by 排序,往往这个排序会极大影响数据性能。解决方法:创建索引,引入排序。比如:oder by a desc,b desc,c desc那么可以:create index idx_desc on table_name(a desc,b desc,c desc);那么在执行计划中就可以看到查询语句使用的是:index full scan,而不是 index range scan 和sort(order by a,b,c)极大提高查询速度![@more@]
RBO表的顺序
讨论表的顺序有几个前提;(一):RBO (二):table full scanselec * from 在选择驱动表和被驱动表的时候,肯定和from有关系,一般是以from最后面的一个表,也就是最右边的一个为驱动表的。所以这个时候,应该把小表放在最后面。但是,当不是全表扫描的时候,数据库会改表这个选择顺序。当有索引扫描的时候,会根据索引来选择驱动表和被驱动表。而且如果数据库优化器用的是CBO,那么和FROM后面的表顺序无关。[@more@]
统计信息——table
manual statistics:下面语句在命令行可以运行sql>exec dbms_stats.gather_table_stats('wiliam','tb_sale',estimate_percent=>100,cascade=>true);wilaim:用户tb_sale:表estimate_percent:统计比例,第一次采用100%cascade:统计索引[@more@]
前台后台运行程序命令
用户有时的程序有可能要花费很多时间,如果将它放在前台运行,将导致无法继续做其他事情,最好的方法就是将它放在后台运行,甚至可能希望在用户注销系统后,程序还可以继续运行。让我们看看那如何实现这一目的。 1,在后台运行程序的&、bg命令 将程序放到后台运行的最简单方法就是在命令最后加上“&”,范例如下: [tony@free root]# updatedb & ← 在后台执行 locate 数据库更新命令 [tony@free root]# bg ← 将更新操作放到后台运行 2,前台运行的程序fg命令 如果用户当前已有程序在后台运行,可以
sql语句中常量处理——to_char and to_date 调优
tuning sql sql语句调优尽量避免在列上调用函数,如果不能避免则在常数上使用函数。下面这证明这一点; (一)SQL语句解释和执行时间比较测试语句A和语句B,功能是等价的,explain plan都走相同的索引,但是cost不一样。 A:这是一个标准的写法,建议都用这个,列"add_time"为date类型。 select count(*)from wiliam.tb_sale where add_time>=to_date('2011-01-11 00:00 ','yyyy-mm-dd hh24:mi:ss')and add_time<to_date('2011-01-12 00:00 ','yyyy-mm-dd hh24:mi:ss') B:在列上“add_time"使用"to_char"
驱动表和被驱动表
驱动表:要选择小的表作为驱动表大的表作为被驱动表"驱动表是在使用多表嵌套连接时,会先全表扫描该驱动表,然后驱动表返回的结果集中一行一行去匹配被驱动表(可以利用索引),所以我们会选择小表做为驱动表,而被驱动使用索引进行连接。对于基于规则的优化系统,驱动表在FROM后是有次序设置的,CBO而在基于成本的优化,ORACLE会选择最合适的驱动表。但是数据库有的时候不一定会选择较小的表作为驱动表,需要TUNING[@more@]
physical read and buffer read
1.物理读(physical read)当数据块第一次读取到,就会缓存到buffer cache 中,而第二次读取和修改该数据块时就在内存buffer cache 了 以下是例子如果有新的数据需要被读入Buffer Cache中,而Buffer Cache又没有足够的空闲空间,Oracle就根据LRU算法将LRU链表中LRU端的数据置换出去。当这些数据被再次访问到时,需要重新从磁盘读入。逻辑读(buffer read)逻辑读指的就是从(或者视图从)Buffer Cache中读取数据块。按照访问数据块的模式不同,可以分为即时读(Current Read)和一致性读(Consistent Read)。注意:逻辑IO只有逻辑读,没有逻辑写
oracle 后台进程:7大进程总结(转载)
前面我们说过,Oracle的实例由内存结构和一组后台的进程组成。Oracle的后台进程比较重要的包括以下几个:·SMON·PMON·DBWR·LGWR·ARCH·CKPT下面我们将逐一介绍各个进程的作用。一、SMONSMON(System Monitor)-系统监控进程,在实例启动时执行实例恢复,并负责清理不再使用的临时段。SMON进程要完成所有“系统级”任务。PMON感兴趣的是单个的进程,而SMON与之不同,它以系统级为出发点,这是一种数据库“垃圾收集器”。SMON所做的工作包括: ·清理临时空间 ·合并空闲空间 ·针对原来不可用的文件恢复活动的事务 ·执行RAC中失败节点的
V$sqlarea 分析以及max(),min() 调优
V$sqlarea 分析(一)v$sqlarea作用和参数解析V$sqlarea用于分析SHARED_POOL中共享sql语句占用系统资源的情况几个重要参数buffer_gets,disk_reads,executions 三个最重要的参数l HASH_VALUE:SQL语句的Hash值。ADDRESS:SQL语句在SGA中的地址。这两列被用于鉴别SQL语句,有时,两条不同的语句可能hash值相同。这时候,必须连同ADDRESS一同使用来确认SQL语句。l SQL_TEXT:SQL语句的文本(最大只能保存该语句的前1000个字符)。l SHARABLE_MEMORY:cursor使用的共享内存总数l SORTS表示排序的次数;
expain plan 不走索引的原因总结
4、为什么有时一个表的某个字段明明有索引,当观察一些语的执行计划确不走索引呢?如何解决呢 ? A、不走索引大体有以下几个原因 ♀你在Instance级别所用的是all_rows的方式 ♀你的表的统计信息(最可能的原因) ♀你的表很小,上文提到过的,Oracle的优化器认为不值得走索引。 B、解决方法 ♀可以修改init.ora中的OPTIMIZER_MODE这个参数,把它改为Rule或Choose,重起数据库。也可以使用4中所提的Hint.补充:不走索引的原因,甚至加上 /*+index(table_name index_name)*/还不走索引,那可能是因为你要走索引的这列是nullable,虽然这列没有空值。
RBO AND CBO (二)
1、OPTIMIZER_MODE选项如下:* ALL_ROWS* FIRST_ROWS_n* FIRST_ROWS* CHOOSE* RULE1、CHOOSE仅在9i及之前版本中被支持,10g已经废除。8i及9i中为默认值。这个值表示SQL语句既可以使用RBO优化器也可以使用CBO优化器,而决定该SQL到底使用哪个优化器的唯一因素是,所访问的对象是否存在统计信息。如果所访问的全部对象都存在统计信息,则使用CBO优化器优化SQL;如果只有部分对象存在统计信息,也仍然使用CBO优化器优化SQL,优化器会为不存在统计信息对象依据一些内在信息(如分配给该对象的数据块)来生成统计信息,只是这样生成的统计信息可
RBO 和CBO分析
ORACLE 提供了CBO、RBO两种SQL优化器。Rule based optimizer(RBO) 基于规则Cost based optimizer (CBO) 基于成本,或者讲统计信息1:使用CBO 时,编写SQL语句时,不必考虑"FROM" 子句后面的表或视图的顺序和"WHERE" 子句后面的条件顺序;ORACLE自7版以来采用的许多新技术都是基于CBO的,如星型连接排列查询,哈希连接查询,函数索引,和并行查询等。2:使用CBO 时,要注意看采用了哪种类型的表连接方式。ORACLE的共有Sort Merge Join(SMJ)、Hash Join(HJ)和Nested Loop Join(NL)。CBO有时会偏重于SMJ 和 HJ,但
insert /* APPEND */ into table_name用法
insert /* APPEND */ into emp中/* APPEND */Append 是将数据添加在table 后。不会替换掉里面相同的数据。也不会使用index ,对添加到里面的数据排序。 使用新块而不用已经已经使用的块 加快insert速度 ,使用hwk以上的块APPEND : Only valid for INSERT .. SELECT. Allows INSERT to work like direct load or to perform parallel insert.[@more@]