关于实体化视图和查询重新的一些想法
通过上面三篇文章对实体化视图(物化视图)和查询重写的介绍和分析,我认为:实体化视图在数据复制、灾备和查询优化等等方面都有很好的应用前景。由于众多的应用限制,查询重写就是个垃圾!![@more@]
实体化视图和实体化视图查询重写的限制
查询重写的限制包括:1.如果实体化视图包括本地表和远端表,则只有本地表支持查询重写;2.基表和实体化视图都不能处于SYS用户下;3.实体化视图的查询中如果包含SELECT和GROUP BY列表,则二者必须保持一致;4.聚集函数必须在表达式的最外层;5.不允许CONNECT BY语句。实体化视图的限制:1.实体化视图中不能包括ROWNUM、SYSDATE等不可重复的表达式;2.实体化视图不能包括LONG或LONG RAW或对象参考列;3.如果实体化视图的查询定义中包括集合操作(如minus、union等),则实体化视图只支持全文匹配的查询重写;4.如果以PREBUILD方式建立实体化
实体化视图的创建和修改
一、权限grant create materialized view to user_name;grant query rewrite to user_name;---查询重写权限如果用户没有建表权限grant create any table to user_name;二、创建实体化视图日志create materialized view log on table_name;三、创建实体化视图create materialized view mview_namebuild immediate -------------说明1refresh fast on commit--------说明2enable query rewrite----------说明3asselect * from ^^^^^^;1.说明1:默认选项就是build immediate,意思是立刻建立实体化视图另一种方法是build deferred,此选项将
实体化视图的查询重写功能
实体化视图(materialized view)是一个很好的功能,他不像普通视图似的每次查询都需要重新运行一个sql语句,他会将查询的结果存在数据库中,占用一些物理空间。实体化视图可以提供一种叫做查询重写的功能,这个功能可以自动对查询语句进行优化。一、查询重写功能的前提:1.初始化参数QUERY_REWRITE_ENABLED设置成TRUE(默认值是FALSE)2.在创建实体化视图时指定ENABLE QUERY REWRITE子句3.数据库使用CBO二、如果没有使用查询重写功能就报错可以设置一个提示/*+REWRITE_OR_ERROR*/,这样如果这个select语句没有使用查询重写功能,它就会报
oracle中CBO的不稳定性
oracle中的CBO是一个智能化的程序,他会根据表内数据或者索引的不同,而执行不同的解释计划,在有时候他会很好。比如说:如果一个表有1000万条记录,而字段A中=1的数据有500万条,字段A上面有一个普通索引,当我们做下面查询的时候:select * from table where fielda=1;oracle就会选择全表扫描,而不是通过索引扫描。但是有时候oracle的CBO也会出现问题,他会不按照我们的安排来选择一个错误的执行计划。通过大量的对比我发现,oracle的CBO选择执行计划和下面几个因素是相关的:1.索引的使用通常出现CBO错误的表都带有索引2.oracle的统计
(zt)DBMS_STATS.GATHER_TABLE_STATS详解
作用:DBMS_STATS.GATHER_TABLE_STATS统计表,列,索引的统计信息.DBMS_STATS.GATHER_TABLE_STATS的语法如下:DBMS_STATS.GATHER_TABLE_STATS ( ownname VARCHAR2, tabname VARCHAR2, partname VARCHAR2, estimate_percent NUMBER, block_sample BOOLEAN, method_opt VARCHAR2, degree NUMBER, granularity VARCHAR2, cascade BOOLEAN, stattab VARCHAR2, statid VARCHAR2, statown VARCHAR2, no_invalidate BOO
oracle中获得统计信息的方法
oracle的CBO是通过统计信息来解析出执行计划的,而对于一个新建立的数据库来说,因为没有执行过获取统计信息的程序,所以统计信息经常是错误的,这就需要我们经常手动收集统计信息,下面列一下几个简单的收集统计信息的方法:----得到一个表的统计信息(可以不加size skewonly,但速度会慢一些)DBMS_STATS.GATHER_TABLE_STATS(ownname => 'OWNER_NAME',tabname => 'TABLE_NAME',method_opt => 'for all indexed columns size skewonly');--直方图统计所有索引列DBMS_STATS.GATHER_TABLE_STATS(ownname => 'OWNER_NAME',tabn
oracle补丁地址,没下载过,不知道是否好用,从eygle copy的
oracle 9208 patch: ftp://updates.oracle.com/4547809/p4547809_92080_AIX64-5L.zipftp://updates.oracle.com/4547809/p4547809_92080_AXP.zipftp://updates.oracle.com/4547809/p4547809_92080_HP64.zipftp://updates.oracle.com/4547809/p4547809_92080_HPUX-IA64.zipftp://updates.oracle.com/4547809/p4547809_92080_LINUX-S390.zipftp://updates.oracle.com/4547809/p4547809_92080_LINUX.zipftp://updates.oracle.com/4547809/p4547809_92080_Linux-IA64.zipftp://updates.oracle.com/4547809/p4547809_92080_Linux-x86-64.zipftp:
oracle关于cursor的两个参数
open_cursors指每个session可以同时打开的游标个数。 这个值设的越大越好,缺省值是300,可以设成800 session_cached_cursors指每个session可以放在内存中的游标数量 对于java程序来说,没打开一个ResultSet,就会在数据库中打开一个游标,cached cursors就会增加一个。 所以对于一个java程序的数据库来说,如果内存足够的话,这个参数应该设置的大一些,设置成2000比较合适。 如果open的cursor超过了2000,那么这些cursor就会被从内存中清除出去。 而对于plsql来说,如果打开一个游标,只会使这个参数的值增加1,每次游标next,这
对于大数据量OLAP系统的一些经验
对于大数据量OLAP系统的一些经验:1.oracle的CBO影响oracle的CBO很不稳定,尤其是在有多个索引的干扰之下,oracle自己会选用nested loop来运行。我们需要在脚本中用hint指定使用哈希连接。使用方法:select /*+use_hash(a b)*/ a.*,b.* from table_name1 a,table_name2 bwhere a.column_name=b.column_name;有时oracle的CBO甚至会傻到去全扫描数据库索引,然后回表再查出数据。这是也需要指定不使用索引,或者直接全表扫描/*+no_index*/ /*+full(table_name)*/2.nested loop和hash join对于OLTP系统来说,由于单个select语句很小,而且一
数据库PGA内存对应HASH JOIN数据量估算
数据库PGA内存对应HASH JOIN数据量估算1.oracle数据库的PGA分配多大比较合理 以一个8G内存的机器为例,分配给oracle的内存大概占到总内存的80% 对于OLAP系统来说,分配给PGA的内存=8G*80%*50%=3.2G 对于OLTP系统来说,分配给PGA的内存=8G*80%*20%=1.28G2.对于单个session能够得到的最大PGA是多大。 ORACLE缺省每个session可使用的内存并不是全部PGA大小,实际上比这个小得多,普通会话可使用只有PGA的5%,并且不能超过100M。 对于OLAP系统来说,单个session的PGA=min(3.2G*5%,100M)=min(160M,100M)=100M 对于OLTP系统来说,单个session的P
AWR、ASH和Statspack的生成语句
---Statspack初始化方法(必须拥有DBA权限)@$ORACLE_HOME/rdbms/admin/spcreate.sql---Statspack删除方法@$ORACLE_HOME/rdbms/admin/spdrop.sql---Statspack清除方法@$ORACLE_HOME/rdbms/admin/sptrunc.sql---Statspack创建快照方法sqlplus perfstat/perfstatexec statspack.snapselect snap_id,snap_time from stats$snapshot;--生成Statspack报告方法@$ORACLE_HOME/rdbms/admin/spreport.sql--根据上面查询出来的快照号码来生成报告ASH和AWR都是oracle自动创建的,不用手动创建AWR快照也是一个小时一个自动创建的ASH是看最近的性能的,
关于oracle的CBO一些不可思议的事情
1)今天运行了下面的脚本insert into FS_DEVICE_CURRENT_COLD( current_id,manufacturer,device_instance_id, MODEL, DEVICE_VERSION, LAST_MODIFIED_TIME, DEVICE_ID, NODE_MASK, NODE_MASK_ID ) select /*+use_hash(b a)*/ b.CURRENT_ID, b.manufacturer,b.device_instance_id, b.MODEL, b.DEVICE_VERSION , b.LAST_MODIFIED_TIME, a.DEVICE_ID, 0 NODE_MASK, 0 NODE_MASK_IDfrom odomain19.FS_DEVICE_CURRENT b, mvp_device_instance_cold a where b.device_instance_id= a.device_instance_id(+);这是一条普通的插入语句,表a有
删除数据表中的重复记录
1.先创建一个表CREATE TABLE APPTEST (APP_ID INTEGER primary key NOT NULL,MOBILE nvarchar2(50) NOT NULL);向其中插入1kw条测试数据2.假设其中MOBILE字段大量重复,要删除重复记录,可以有如下三种方法:(1)简单利用rowid删除delete from APPTEST a where rowid not in (select max(rowid) from APPTEST b where a.mobile=b.mobile);据说,这种方法在数据量很大时,效率并不高有一些人说这种方法因为用到了rowid,所以效率较高。经测试,花费时间2222s。回滚空间自动膨胀到2.5G。(2)利用分析函数delete APPTEST where rowid in (select
(zt)oracle的分析函数over 及开窗函数(增加了一点自己的理解)
oracle的分析函数over 及开窗函数[@more@]一:分析函数overOracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。 下面通过几个例子来说明其应用。 1:统计某商店的营业额。 date sale1 202 153 144 185 30create table test_over(date1 number,num number)insert into test_over values (1,10);insert into test_over values (2,33);insert into test_over values (3,12);insert into test_over values (4,23);insert into test_over valu
spool用法示例
下面文章简单介绍了一下spool的用法[@more@]set pagesize 0; --//##分页set echo off; --//##显示脚本中正在执行的SQL语句set space 0; --//##输出列间空格数set newp none; --//##页和页之间间隔set verify off; --//##文件校验set termout off; --//##屏幕内容输出set trimout on; --//##标准输出每行的拖尾空格set trimspool on; --//##重定向(spool)输出每行的拖尾空格set feedback off; --//##查询的行数set colsep =; --//##域输出分隔符set heading off; --//##列标题set linesize 500; --//##行允许字符数set timing off; --//#
查找系统中热点块top10
------查找系统中热点块top10 select /*+rule */ * from dba_objects where data_object_id in (select obj from (select obj from x$bh order by tch desc) where rownum<11); [@more@]------查找系统中热点块top10 select /*+rule */ * from dba_objects where data_object_id in (select obj from (select obj from x$bh order by tch desc) where rownum<11);
linux设置自动关机的方法
我用的方法是用crontab调用linux的关机命令。1.root登陆到linux主机2.运行crontab -e命令3.然后点击"i",对文本框进行编辑4.将下面内容填入:0 18 * * * halt -p意思是每天18:00整定时运行halt -p命令halt -p命令就是关机的意思。5.运行“:wq”进行保存退出6.运行下面的命令:/sbin/service crond restart意思是重启crond服务。7.设置成功感受:1.关机命令有很多种shutdown now这种关机命令不包含关闭电源,所以当你运行之后发现机器的电源还亮着。init 0这个关机命令很好,而且也包含关闭电源。但是不知道为什么,不能在cront
监控linux剩余空间脚本
#!/bin/shexport ORACLE_HOME=/home/oracle/oracle/product/10.2.0/db_1export ORACLE_SID=zhunxincd /home/oracle#从配置文件中取用户名和密码(现在暂时直接写死)v_user=ods #`awk -F: '{if($1 =="user") print $2}' ./passwd`v_pass=zhunxin #`awk -F: '{if($1 =="pass") print $2}' ./passwd`echo $v_userecho $v_passmessage1=`df|sed -n '2p'|awk '{print $5}'`echo "exec ods.insert_log('192.168.2.84','used $message1 S.M.S'); "|sqlplus "$v_user"/"$v_pass"@zhunxin [@mo
oracle加入到linux自启动里
编辑/etc/rc.d/rc.local文件将下面的内容填入里面su - oracle -c "sh /home/oracle/oraclestartup.sh"下面这两行和oracle自启动无关,写上只是说明其他程序也可以这样添加到自启动里:将svn自启动也放在里面su - xingg -c "svnserve -d -r /svn/"自己写了个oracle自启动脚本,名字是oraclestartup.sh,内容如下,写的不是很好,通用性不强如果移植到新机器上需要编辑一下:#!/bin/shexport ORACLE_HOME=/home/oracle/oracle/product/10.2.0/db_1export ORACLE_SID=zhunxincd /home/oracleecho "startup"|sq