手工创建完数据库后,接下来是配置db console了。如下的创建过程供大家参考!
查看全文手工创建完数据库后采用os方式可以正常登录数据库,但通过监听走tnsnames的方式却一直挂着,tnsping的结果正常。
查看全文如下是我手工创建的脚本,供大家参考! 查看全文
男人爱动,从小爱看卡通片(cartoon),模仿李小龙(Bruce Li)练武术(Wushu,功夫叫:Kunfu),稍大一些后比力气练柔道(judo),念中学时学霹雳舞(break dance)和蹦极跳 (bunge jumping),受伤是难免的,所以阿司匹林(aspirin)和邦迪(Band-Aid)就成了必备药。 查看全文
首先,数据集市中存储了由数据仓库来的,经过裁剪和归整的数据,这些数据针对某个业务部门或某种业务分析主题而建立。在数据集市中,数据在某种程度上都进行了各种层次的汇总,并建立了多维分析模型,同时也会有数据采样。数据集市中的数据一般由ETL统一调度数据归整模块来实现从数据仓库到数据集市。
查看全文最近参与一个BI项目,在将ODS区中数据分流适配到F明细区中时,运用到了BULK COLLECT、FORALL和INSERT ALL用来提高性能。关键语句如下:
查看全文上个礼拜五给一哥们解决数据迁移的问题,发觉有很多表导入失败,原因有二:一是由于部分表有大对象字段,二是由于部分表是分区表。解决方法是新建对应的表空间。
由于系统的数据文件都建在裸设备上,在新建表空间时需找出空闲的裸设备lv来。坦白将hp平台上没有直接的操作系统指令能查看到裸设备的使用与未使用状况。只能借助于查询oracle中相关数据字典来实现。具体的方法是查询dba_data_files,dba_temp_files,v$controlfile和v$logfile看这四类文件具体占用的裸设备,然后结合os上已有的lv(vgdisplay,lvdisplay等命令)来确定那些lv可以被使用。
ps,在我们新建lv时,最好能将序号,lv的大小等相关信息赋给lv名,这样在使用lv时按序号来使用,找出已使用最大的就ok了。
Wayne: What are we going to eat for dinner?
Lilia: I'm going to fix some pork chops.
Wayne: I'm afraid the meat is rotten.
Lilia: That's strange! I just bought it the day before yesterday.
Wayne: Well, I forgot to put it in the refrigerator.
Lilia: Good for you! Now what should we eat?
Wayne: Why don't we eat out?
Lilia: Again? Weren't you just complaining that it's too expensive to eat out?
Wayne: Not when you're hungry.
2、数据集成
3、数据变换
4、数据归约
1、适当时水平分割和垂直分割表;
查看全文下面的两种情况,那种写法执行效率高。
1、delete from subject_data where subject_id in (130,129,127);
2、delete from subject_data where subject_id = 130;
delete from subject_data where subject_id = 129;
delete from subject_data where subject_id = 127;
在subject_id列有索引的情况下显然是第一种情况执行效率高。其执行计划如下:
Execution Plan
----------------------------------------------------------
0 DELETE STATEMENT Optimizer=CHOOSE
1 0 DELETE OF 'SUBJECT_DATA'
2 1 CONCATENATION
3 2 INDEX (RANGE SCAN) OF 'SD_SUBJECT_ID' (NON-UNIQUE)
4 2 INDEX (RANGE SCAN) OF 'SD_SUBJECT_ID' (NON-UNIQUE)
5 2 INDEX (RANGE SCAN) OF 'SD_SUBJECT_ID' (NON-UNIQUE)
这两种情况虽然执行相同次数的INDEX RANGE SCAN,但1只需解析一次2要解析3次。
另外,在subject_id列没有索引的情况下也仍然是第一种情况执行效率高,理由同第一种情况。
几乎每两三天的时间就会收到告别的邮件,曾经熟悉的同事渐渐从视线中消失。
查看全文在数据仓库中有三种数据库模式,分别如下:
星型模式:1个事实表+1组维表,维表围绕事实表(中心表)显示在射线上;
雪花模式:是星型模式的变种,其中某些维表将数据进一步分解到附加的维表中,以便减少冗余,但对系统的性能有一定的影响;
事实星座模式:多个事实表共享维表,可看作星型模式集。
Sometimes, kids have extra challenges making friends, even if you're doing everything right as a parent.
All children are capable of having friends, although high self-esteem really helps them succeed, says Kathy Noll. Noll is the author of Taking the Bully by the Horns, which offers help to both bullies and their victims.
如果某位众医院靠着总统候选人(尤其是竞选连任的现任总统)替他站台,拉抬声势而获得胜选,那么他就是得力于总统候选人充分的coattail effect支撑,也可以说,他能进入众议院是riding on the President’s coatails,拉着总统的衣尾搭顺风车。反之,如果总统的声势不足,选情不看好,则不太容易发挥出衣尾效应。这时新闻就会这样说这位总统:His coattail is very short.他的衣尾很短(拉不了几个人)。
布什在1994年竞选连任时,因经济不景气而声望一路下滑,共和党参、众议员候选人避之惟恐不及,深怕染上霉气,受到连累。当时的新闻报道中介绍布什就说:President Bush’s coat has no tails!布什总统的衣服没有尾巴!
declare
ora_user varchar2(30) default 'SCOTT';
begin
execute immediate 'alter user '||ora_user||' account lock';
for crs in (select sid,serial# from v$session where username = ora_user) loop
execute immediate 'alter system kill session '''||crs.sid||','||crs.serial#||'''';
end loop;
end;
/
在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法:
1. /*+ALL_ROWS*/
表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化.
例如:
SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
2. /*+FIRST_ROWS*/
表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化.
例如:
SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
3. /*+CHOOSE*/
表明如果数据字典中有访问表的统计信息,将基于开销的优化方法,并获得最佳的吞吐量;
表明如果数据字典中没有访问表的统计信息,将基于规则开销的优化方法;
例如:
SELECT /*+CHOOSE*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
4. /*+RULE*/
表明对语句块选择基于规则的优化方法.
例如:
SELECT /*+ RULE */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
5. /*+FULL(TABLE)*/
表明对表选择全局扫描的方法.
例如:
SELECT /*+FULL(A)*/ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO='SCOTT';
6. /*+ROWID(TABLE)*/
提示明确表明对指定表根据ROWID进行访问.
例如:
SELECT /*+ROWID(BSEMPMS)*/ * FROM BSEMPMS WHERE ROWID>='AAAAAAAAAAAAAA'
AND EMP_NO='SCOTT';
7. /*+CLUSTER(TABLE)*/
提示明确表明对指定表选择簇扫描的访问方法,它只对簇对象有效.
例如:
SELECT /*+CLUSTER */ BSEMPMS.EMP_NO,DPT_NO FROM BSEMPMS,BSDPTMS
WHERE DPT_NO='TEC304' AND BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
8. /*+INDEX(TABLE INDEX_NAME)*/
表明对表选择索引的扫描方法.
例如:
SELECT /*+INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE FEWMALE BSEMPMS */ FROM BSEMPMS WHERE SEX='M';
9. /*+INDEX_ASC(TABLE INDEX_NAME)*/
表明对表选择索引升序的扫描方法.
例如:
SELECT /*+INDEX_ASC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT';
10. /*+INDEX_COMBINE*/
为指定表选择位图访问路经,如果INDEX_COMBINE中没有提供作为参数的索引,将选择出位图索引的布尔组合方式.
例如:
SELECT /*+INDEX_COMBINE(BSEMPMS SAL_BMI HIREDATE_BMI)*/ * FROM BSEMPMS
WHERE SAL<5000000 AND HIREDATE<SYSDATE;
11. /*+INDEX_JOIN(TABLE INDEX_NAME)*/
提示明确命令优化器使用索引作为访问路径.
例如:
SELECT /*+INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI)*/ SAL,HIREDATE
FROM BSEMPMS WHERE SAL<60000;
12. /*+INDEX_DESC(TABLE INDEX_NAME)*/
表明对表选择索引降序的扫描方法.
例如:
SELECT /*+INDEX_DESC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT';
13. /*+INDEX_FFS(TABLE INDEX_NAME)*/
对指定的表执行快速全索引扫描,而不是全表扫描的办法.
例如:
SELECT /*+INDEX_FFS(BSEMPMS IN_EMPNAM)*/ * FROM BSEMPMS WHERE DPT_NO='TEC305';
14. /*+ADD_EQUAL TABLE INDEX_NAM1,INDEX_NAM2,...*/
提示明确进行执行规划的选择,将几个单列索引的扫描合起来.
例如:
SELECT /*+INDEX_FFS(BSEMPMS IN_DPTNO,IN_EMPNO,IN_SEX)*/ * FROM BSEMPMS WHERE EMP_NO='SCOTT' AND DPT_NO='TDC306';
15. /*+USE_CONCAT*/
对查询中的WHERE后面的OR条件进行转换为UNION ALL的组合查询.
例如:
SELECT /*+USE_CONCAT*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';
16. /*+NO_EXPAND*/
对于WHERE后面的OR 或者IN-LIST的查询语句,NO_EXPAND将阻止其基于优化器对其进行扩展.
例如:
SELECT /*+NO_EXPAND*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';
17. /*+NOWRITE*/
禁止对查询块的查询重写操作.
18. /*+REWRITE*/
可以将视图作为参数.
19. /*+MERGE(TABLE)*/
能够对视图的各个查询进行相应的合并.
例如:
SELECT /*+MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELET DPT_NO
,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO
AND A.SAL>V.AVG_SAL;
20. /*+NO_MERGE(TABLE)*/
对于有可合并的视图不再合并.
例如:
SELECT /*+NO_MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELECT DPT_NO,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO AND A.SAL>V.AVG_SAL;
21. /*+ORDERED*/
根据表出现在FROM中的顺序,ORDERED使ORACLE依此顺序对其连接.
例如:
SELECT /*+ORDERED*/ A.COL1,B.COL2,C.COL3 FROM TABLE1 A,TABLE2 B,TABLE3 C WHERE A.COL1=B.COL1 AND B.COL1=C.COL1;
22. /*+USE_NL(TABLE)*/
将指定表与嵌套的连接的行源进行连接,并把指定表作为内部表.
例如:
SELECT /*+ORDERED USE_NL(BSEMPMS)*/ BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
23. /*+USE_MERGE(TABLE)*/
将指定的表与其他行源通过合并排序连接方式连接起来.
例如:
SELECT /*+USE_MERGE(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
24. /*+USE_HASH(TABLE)*/
将指定的表与其他行源通过哈希连接方式连接起来.
例如:
SELECT /*+USE_HASH(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
25. /*+DRIVING_SITE(TABLE)*/
强制与ORACLE所选择的位置不同的表进行查询执行.
例如:
SELECT /*+DRIVING_SITE(DEPT)*/ * FROM BSEMPMS,DEPT@BSDPTMS WHERE BSEMPMS.DPT_NO=DEPT.DPT_NO;
26. /*+LEADING(TABLE)*/
将指定的表作为连接次序中的首表.
27. /*+CACHE(TABLE)*/
当进行全表扫描时,CACHE提示能够将表的检索块放置在缓冲区缓存中最近最少列表LRU的最近使用端
例如:
SELECT /*+FULL(BSEMPMS) CAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;
28. /*+NOCACHE(TABLE)*/
当进行全表扫描时,CACHE提示能够将表的检索块放置在缓冲区缓存中最近最少列表LRU的最近使用端
例如:
SELECT /*+FULL(BSEMPMS) NOCAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;
29. /*+APPEND*/
直接插入到表的最后,可以提高速度.
insert /*+append*/ into test1 select * from test4 ;
30. /*+NOAPPEND*/
通过在插入语句生存期内停止并行模式来启动常规插入.
insert /*+noappend*/ into test1 select * from test4 ;
5.1节前现网反馈数据库性能很低下,statspack报告发回来后top 5
的两个突出的sql语句如下:
1、SELECT COUNT(*)
FROM (SELECT t0.id,
t0.parentid,
t0.path,
t0.TYPE,
t5.NAME,
t5.catename,
t5.icpcode,
t5.icpservid,
t5.spname,
t5.auditionurl,
t5.downloadurl,
t5.createdate,
t5.expire,
t5.coloringprice,
t5.singer,
t5.special,
t5.editontype,
t5.contenttag,
t5.audiotype,
t5.gameinfourl,
t5.imagename,
t5.servdesc,
t5.chargetype,
t5.price,
t5.accessmodeid,
t5.paymode,
t5.downloadtimes,
t5.nameletter
FROM t_r_base t0, v_gcontent t5
WHERE t0.TYPE LIKE ''
AND t5.id = t0.id
AND t0.TYPE = ''
AND EXISTS (SELECT 1
FROM t_r_base opt0, t_r_reference t4
WHERE opt0.TYPE LIKE ''
AND t4.id = opt0.id
AND opt0.path LIKE ''
AND t0.id = refnodeid)
ORDER BY t5.downloadtimes DESC);
2、SELECT t0.id,
t0.parentid,
t0.path,
t0.TYPE,
t5.NAME,
t5.catename,
t5.icpcode,
t5.icpservid,
t5.spname,
t5.auditionurl,
t5.downloadurl,
t5.createdate,
t5.expire,
t5.coloringprice,
t5.singer,
t5.special,
t5.editontype,
t5.contenttag,
t5.audiotype,
t5.gameinfourl,
t5.imagename,
t5.servdesc,
t5.chargetype,
t5.price,
t5.accessmodeid,
t5.paymode,
t5.downloadtimes,
t5.nameletter
FROM t_r_base t0, v_gcontent t5
WHERE t0.TYPE LIKE ''
AND t5.id = t0.id
AND t0.TYPE = ''
AND EXISTS (SELECT 1
FROM t_r_base opt0, t_r_reference t4
WHERE opt0.TYPE LIKE ''
AND t4.id = opt0.id
AND opt0.path LIKE ''
AND t0.id = refnodeid)
ORDER BY t5.downloadtimes DESC;
其中v_gcontent是个庞大的普通视图。
该语句发生在用户每次高级搜索时执行,对应的分析结果如下:
CPU Elapsd
Buffer Gets Executions Gets per Exec %Total Time (s) Time (s) Hash Value
--------------- ------------ -------------- ------ -------- --------- ----------
225,840,266 95 2,377,266.0 11.1 0.00 6939.53 2689214047
Module: JDBC Thin Client
select t0.id,t0.parentID,t0.path,t0.type,t5.name,t5.cateName,t5.
icpCode,t5.icpServId,t5.spName,t5.auditionUrl,t5.downLoadUrl,t5.
createDate,t5.expire,t5.coloringPrice,t5.singer,t5.special,t5.ed
itonType,t5.contentTag,t5.audioType,t5.gameInfoUrl,t5.imageName,
t5.SERVDESC,t5.CHARGETYPE,t5.PRICE,t5.ACCESSMODEID,t5.PAYMODE,t5
共2,377,266.0个块,总共拿了2,377,266次,包括重复的块读,可见数据是惊人的。
下面是具体的优化细节:
1、在求count时没必要order by,导致排序的记录多时产生大量的buffer和IO;
2、将FROM后语句改写为表关联,不用EXISTS;
3、t0.TYPE LIKE ''是完全多余的条件;
4、将v_gcontent这个庞大的普通视图改为实体化视图并创建索引。
经过上述的优化问题得到解决!
由此给广大的数据库程序开发者和系统设计架构者一些建议,如下:
1、少用嵌套,层次复杂,功能冗余的sql查询语句,多用简单的经过分解或中间转化的sql查询语句;
2、少用子查询(in,exists,not in,not exists等)多用表关联,充分利用表与表之间的索引;
3、普通视图就是一个子查询,每次select视图都是一次子查询;而实体化视图就不一样,它本身就是一张表,有自己的物理存储和索引,性能上比普通视图高。在报表,查询等功能上建议多用;
4、从应用角度上出发,对于一些门户级平台级的系统,并发访问高,强烈不建议每一次访问都去跟数据库交互,这样会把数据库给搞塌掉,建议采用应用级上的数据缓存或本地数据文件形式来提高性能。












