关于处理死锁的一点小知识
SQL> select event,WAIT_TIME from v$session_wait where sid=1608;enq: TM - contention 0SQL> SELECT * FROM v$lock WHERE sid=1608;ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK---------------- ---------------- ---- -- ----- ---- ------ ------- -------07000002530CF6C0 07000002530CF6E8 1608 TM 614265 0 0 6 3118 0SQL> SELECT OBJECT_NAME FROM dba_objects where object_id=614
为什么在ALL_TABLES中查不到表的所属表空间
select TABLESPACE_NAME from all_tables where TABLE_NAME='A'结果为 空为什么会出现这种情况呢?查了一下文档,原来对于分区表,索引组织表,临时表(global tempary)在ALL_TABLES字典表中是查不到其所属表空间的~如果要查此类表空间,可按如下方法:SQL> select distinct TABLESPACE_NAME from dba_segments where SEGMENT_NAME='A';TBS_DW_FACE_00OK 了~[@more@]
关于索引组织表IOT
索引组织表的数据按主键排序手段被存储在B-树索引中,除了存储主键列值外还存储非键列的值。普通索引只存储索引列,而索引组织表则存储表的所有列的值。索引组织表一般适应于静态表,且查询多以主键列。当表的大部分列当作主键列时,且表相对静态,比较适合创建索引组织表!(8i以上)索引组织表的创建:CREATE TABLE docindex(token char(20),doc_id NUMBER,token_frequency NUMBER,token_offsets VARCHAR2(512),CONSTRAINT pk_docindex PRIMARY KEY (token, doc_id))ORGANIZATION INDEX TABLESPACE ind_tbs;必须给索引结构表指定主键。
关于倒数据的速度记录问题
公司最近DW重构,迁移一个数据量极大的模块,共分为三个表,先说一下服务器配置: 今天先倒第一张表,数据量约为15G,因为里边存在异常数据,故用行级游标一条条地判断插入,异常数据到异常表,正常数据到正常表,用时约8小时[@more@]
db file scattered read与事件db file sequential read相类似(转)
当会话发布一个读入多个数据块的IO请求时提交该事件。ORACLE会话等待多个连续的数据块(由初始参数DB_FILE_MULTIBLOCK_READ_COUNT指定)从磁盘读入到SGA中。 该事件是在全表扫描或索引快速全局扫描时发生的典型事件。 初始化参数db_file_multiblock_read_count(MBRC)决定了读取数据块的最大数目,有两种情况会造成多块读取操作被分成几次操作: >> MBRC因子不能跨越整个区,如果一个区包含10个块,MBRC因子=8,那么多块读取会发布两次读取调用,一次8个数据块,一次2个数据块。>> 要读取的多块有,有一部分已在CACHE中,这时多
关于v$session_wait 表的运用
SQL> desc v$session_wait Name NULL? Type ---------------------------------- -------- ----------------- SID NUMBER SEQ# NUMBER EVENT VARCHAR2(64) P1TEXT VARCHAR2(64) P1 NUMBER P1RAW RAW(8) P2TEXT
一个语句同时INSERT多个表
在以前的版本中,如果想插入多个表中,需要使用多条INSERT语句,9I开始可以用一条INSERT语句实现向多个表中插入数据.INSERT [ALL] [conditional_insert_clause][insert_into_clause values_clause] (subquery)其中conditional_insert_clause如下:[ALL] [FIRST][WHEN condition THEN] [insert_into_clause values_clause][ELSE] [insert_into_clause values_clause]上面的语法说明其实包含了两种情况>无条件>有条件,所以后面的conditional_insert_clasue里出现的[ALL]和INSERT后面的[ALL]是分属两种情形下的举例就很容易理解了无条件INS
关于NO_DATA_FOUND
SQL> DECLARE2 l_pv NUMBER;3 BEGIN4 --确定绑定的OFFER在统计日的PV5 SELECT (pv)6 INTO l_pv7 FROM cnmir.offerid_pv8 WHERE offer_id=457556756759 AND report_time=20071108;10 11 --防止日志数据异常,没有OFFER对应的PV值,此为数据异常12 EXCEPTION13 WHEN NO_DATA_FOUND THEN14 l_pv:=-110;15 DBMS_OUTPUT.put_line(l_pv);16 END;17 /-110PL/SQL procedure successfully completed.SQL> DECLARE2 l_pv NUMBER;3 BEGIN4 --确定绑定的OFFER在统计日的PV5 SELECT SUM(pv)6 INTO l_pv7 FROM cnmir.offerid_pv8 WHERE offer_id=457
关于autotrace
set autotrace on explain on只显示执行计划不执行语句[@more@]
关于connect by的灵活运用
第一步:创建测试PSCREATE OR REPLACE PROCEDURE etl.test_connectAS --l_begin_date DATE; --l_issue_length NUMBER:=8; CURSOR c_issue_id IS SELECT EW_ISSUE_ID, EW_BEGIN_DATE, TRUNC(EW_END_DATE)-TRUNC(EW_BEGIN_DATE) issue_length FROM cnface.cn_ew_issue_dimt0 WHERE EW_ISSUE_STATUS='biding'; BEGIN FOR r_issue_id IN c_issue_id LOOP INSERT INTO cnface.a SELECT r_issue_id.EW_BEGIN_DATE+a.rn FROM ( SELECT ROWNUM-1 rn FROM DUAL connect BY ROWNUM<=r_issue_id.issue_length ) a; END LOOP; CO
ETL的方法和一般过程
ETL的设计ETL的设计分三部分:数据抽取、数据的清洗转换、数据的加载。在设计ETL的时候我们也是从这三部分出发。数据的抽取是从各个不同的数据源抽取到ODS(Operational Data Store,操作型数据存储)中——这个过程也可以做一些数据的清洗和转换),在抽取的过程中需要挑选不同的抽取方法,尽可能的提高ETL的运行效率。ETL三个部分中,花费时间最长的是“T”(Transform,清洗、转换)的部分,一般情况下这部分工作量是整个ETL的2/3。数据的加载一般在数据清洗完了之后直接写入DW(Data Warehousing,数据仓库)中去。 ETL的实现方法 ETL
数据仓库中维度变化和事实变化的处理方法
. 维度慢慢改变。你的应用必须反映出移植到仓库中的数据源所发生的数据变化。维表中的数据特别容易变化。但你怎么维护记录的历史变化呢? 第一个也是最简单的方法是重写现有的记录而不跟踪变动。幸运的是,这个方法被许多维度所接受。例如,如果一个部门名称从“财务”变为“财务和会计”,你很可能并不需要记录这种历史变化。但是,从客户和学生的角度看,常常有必要保持跟踪姓名、婚姻状态、教育程度和其它属性的变化——你的应用必要能够获得当前的以及历史的数值。 管理维度慢慢改变的第二个方法是数值发生变化时创建一个
ETL难以成功的原因
ETL难以成功有以下几个难点: 1 . 数据仓库的数据来自于多个数据源,所以数据的一致性很难得到保证,很多情况下需要一种硬性的标准来决定数据的取舍问题,如来源于dl_crmcn,dl_ocnsb1,dl_bops,dl_cnweb2 . 数据格式问题,例如数据缺失,超出数据范围,无效数据格式等等。如在member 的gmt_create时间居然有000000000格式的 3 . 出现错误之后没有正确的处理问题,导致数据的质量不断的下降。 4 . 数据一致性问题,处于数据库性能考虑,有时候可能会有意的去掉一些外键或者检查约束。 5 . 业务逻辑问题.由于数据库在最初设计时就不够严格和谨慎
recyclebin(转)
我们都知道,在oracle 10g中有个叫做flash drop的新特性。也就是把删除的表,放进类似回收站的recyclebin中。这样,当你发现drop错表的时候,你可以使用:flashback table tb_name to before drop ;来恢复前一次删除的表。当然,oracle有它自己的对recyclebin空间的回收的办法。本来是件好事,可是由于删除的表很多,产生了大量的recyclebin里的表,感觉很不舒服。同事都让我把recyclebin给禁用了,没有办法只有禁用了。方法如下:%20select">sys@crmdata> select * from v$version;BANNER----------------------------------------
Oracle 分析函数使用介绍(转)
分析函数是oracle816引入的一个全新的概念,为我们分析数据提供了一种简单高效的处理方式.在分析函数出现以前,我们必须使用自联查询,子查询或者内联视图,甚至复杂的存储过程实现的语句,现在只要一条简单的sql语句就可以实现了,而且在执行效率方面也有相当大的提高.下面我将针对分析函数做一些具体的说明.今天我主要给大家介绍一下以下几个函数的使用方法1. 自动汇总函数rollup,cube,2. rank 函数, rank,dense_rank,row_number3. lag,lead函数4. sum,avg,的移动增加,移动平均数5. ratio_to_report报表处理函数6.
关于Partition列被更新的问题
一、今天遇到这样一个问题: Error Msg is ORA-14402: updating partition key column would cause a partition change解决办法为: alter table owner.table_name enable row movement;二、SQL> create table ttt(a number) 2 partition by range(a) 3 (partition p1 values less than (10), 4 partition p2 values less than (20)); Table created. SQL> insert into ttt values(1); 1 row created. SQL> commit;
ascii函数和substr函数的用法
一、ascii函数只取给予参数中第一位的asc值SQL> select ascii('nihao') from dual;ASCII('NIHAO')--------------110SQL> select ascii('n') from dual;ASCII('N')----------110二、substr是按字节取字符SQL> select substr('guojun',1,1) from dual;S-gSQL> select substr('guojun',1,2) from dual;SU--guSQL> select substr('郭军哈',1,1) from dual;S-?SQL> select substr('郭军哈',1,2) from dual;SU--郭--因为英文占两个字节,中文占四个字节[@more@]
oracle中ascii函数及to_char函数使用及编码间的转换
一、ascii->charSQL> CREATE OR REPLACE PROCEDURE pasc_to_char(one IN VARCHAR2)2 --RETURN VARCHAR23 AS4 i NUMBER:=1;5 two VARCHAR2(200):='';6 7 BEGIN8 FOR i IN 1..length(one)-19 LOOP10 two:=two||TO_CHAR(ASCII(SUBSTR(one,i,1)));11 DBMS_OUTPUT.put_line(two);12 END LOOP;13 --RETURN two;14 -- DBMS_OUTPUT.put_line(two);15 END;16 /Procedure created.SQL> exec pasc_to_char('guojun');103103117103117111103117111106103117111106117PL/SQL procedure successfully completed.二、 SQL> select to_char(a
flashback table 用法
我们都知道,在oracle 10g中有个叫做flash drop的新特性。也就是把删除的表,放进类似回收站的recyclebin中。这样,当你发现drop错表的时候,你可以使用:flashback table tb_name to before drop ;来恢复前一次删除的表。当然,oracle有它自己的对recyclebin空间的回收的办法。本来是件好事,可是由于删除的表很多,产生了大量的recyclebin里的表,感觉很不舒服。同事都让我把recyclebin给禁用了,没有办法只有禁用了。方法如下:%20select">sys@crmdata> select * from v$version;BANNER----------------------------------------
dbms_metadata.get_ddl的用法
FUNCTION get_ddl ( object_type IN VARCHAR2, name IN VARCHAR2, schema IN VARCHAR2 DEFAULT NULL, version IN VARCHAR2 DEFAULT 'COMPATIBLE', model IN VARCHAR2 DEFAULT 'ORACLE', transform IN VARCHAR2 DEFAULT 'DDL') RETURN CLOB; 1、从数据字典中获得指定用户下的table和index的DDL脚本 set heading off; set echo off; Set pages 999; set long 90000; spool d:ddl_list.sql select dbms_metadata.get_ddl('TABLE','DEPT','SCOTT') from dual; select dbms_metadata.get_ddl('INDEX','DEPT_IDX','SCOTT') from dual; spool off