MYSQL教程之ORACLE之经常使用FAQ V1.0 (4)
一个相关的问题是第三方支持的资格问题,尽管直接来自厂商的支持和服务可以一定程度上减缓这个问题,但是,对于有的企业来说,通过强有力的本地化支持显然更有吸引力。oracle第四部分、功能调剂假如设置主动跟踪
用system登录
实行$ORACLE_HOME/rdbms/admin/utlxplan.sql创立企图表
实行$ORACLE_HOME/sqlplus/admin/plustrce.sql创立plustrace脚色
假如想企图表让每一个用户都能利用,则
SQL>createpublicsynonymplan_tableforplan_table;
SQL>grantallonplan_tabletopublic;
假如想让主动跟踪的脚色让每一个用户都能利用,则
SQL>grantplustracetopublic;
经由过程以下语句开启/中断跟踪
SETAUTOTRACEON|OFF
|ONEXPLAIN|ONSTATISTICS|TRACEONLY|TRACEONLYEXPLAIN
假如跟踪本人的会话大概是他人的会话
跟踪本人的会话很复杂
Altersessionsetsql_tracetrue|false
Or
Execdbms_session.set_sql_trace(TRUE);
假如跟踪他人的会话,必要挪用一个包
execdbms_system.set_sql_trace_in_session(sid,serial#,true|false)
跟踪的信息在user_dump_dest目次下能够找到或经由过程以下剧本取得文件称号(合用于Win情况,假如是unix必要做必定修正)
SELECTp1.value||||p2.value||_ora_||p.spid||.orafilename
FROM
v$processp,
v$sessions,
v$parameterp1,
v$parameterp2
WHEREp1.name=user_dump_dest
ANDp2.name=db_name
ANDp.addr=s.paddr
ANDs.audsid=USERENV(SESSIONID)
最初,能够经由过程Tkprof来剖析跟踪文件,如
Tkprof原文件方针文件sys=n
怎样设置全部数据库体系跟踪
实在文档上的altersystemsetsql_trace=true是不乐成的
可是能够经由过程设置事务来完成这个事情,感化相称
altersystemsetevents
10046tracenamecontextforever,level1;
假如封闭跟踪,能够用以下语句
altersystemsetevents
10046tracenamecontextoff;
个中的level1与下面的8都是跟踪级别
level1:跟踪SQL语句,即是sql_trace=true
level4:包含变量的具体信息
level8:包含守候事务
level12:包含绑定变量与守候事务
怎样依据OS历程疾速取得DB历程信息与正在实行的语句
有些时分,我们在OS上操纵,象TOP以后我们失掉的OS历程,怎样疾速依据OS信息取得DB信息呢?
我们能够编写以下剧本:
$morewhoit.sh
#!/bin/sh
sqlplus/nolog100,cascade=>TRUE);
dbms_stats.gather_table_stats(User,TableName,degree=>4,cascade=>true);
这是对命令与工具包的一些总结
1、关于分区表,倡议利用DBMS_STATS,而不是利用Analyze语句。
a)能够并行举行,对多个用户,多个Table
b)能够失掉全部分区表的数据和单个分区的数据。
c)能够在分歧级别上ComputeStatistics:单个分区,子分区,全表,一切分区
d)能够倒出统计信息
e)能够用户主动搜集统计信息
2、DBMS_STATS的弱点
a)不克不及ValidateStructure
b)不克不及搜集CHAINEDROWS,不克不及搜集CLUSTERTABLE的信息,这两个仍然必要利用Analyze语句。
c)DBMS_STATS默许不合错误索引举行Analyze,由于默许Cascade是False,必要手工指定为True
3、关于oracle9内里的ExternalTable,Analyze不克不及利用,只能利用DBMS_STATS来搜集信息。
怎样疾速重整索引
经由过程rebuild语句,能够疾速重整或挪动索引到其余表空间
rebuild有重修全部索引数的功效,能够在不删除原始索引的情形下改动索引的存储参数
语法为
alterindexindex_namerebuildtablespacets_name
storage(……);
假如要疾速重修全部用户下的索引,能够用以下剧本,固然,必要依据你本人的情形做响应修正
SQL>setheadingoff
SQL>setfeedbackoff
SQL>spoold:index.sql
SQL>SELECTalterindex||index_name||rebuild
||tablespaceINDEXESstorage(initial256Knext256Kpctincrease0);
FROMall_indexes
WHERE(tablespace_name!=INDEXES
ORnext_extent!=(256*1024)
)
ANDowner=USER
SQL>spooloff
别的一个兼并索引的语句是
alterindexindex_namecoalesce,这个语句仅仅是兼并索引中统一级的leafblock
损耗不年夜,关于有些索引中存在大批空间华侈的情形下,有一些感化。
怎样利用Hint提醒
在select/delete/update后写/*+hint*/
如select/*+index(TABLE_NAMEINDEX_NAME)*/col1...
注重/*和+之间不克不及有空格
如用hint指定利用某个索引
select/*+index(cbotab)*/col1fromcbotab;
select/*+index(cbotabcbotab1)*/col1fromcbotab;
select/*+index(acbotab1)*/col1fromcbotaba;
个中
TABLE_NAME是必需要写的,且假如在查询中利用了表的别号,在hint也要用表的别号来取代表名;
INDEX_NAME能够不用写,Oracle会依据统计值选一个索引;
假如索引名或表名写错了,那这个hint就会被疏忽;
怎样疾速复制表大概是拔出数据
疾速复制表能够指定Nologging选项
如:Createtablet1nologging
asselect*fromt2;
疾速拔出数据能够指定append提醒,可是必要注重
noarchivelog形式下,默许用了append就是nologging形式的。
在archivelog下,必要把表设置程Nologging形式。
如insert/*+append*/intot1
select*fromt2
注重:假如在9i情况中并设置了FORCELOGGING,则以上操纵是有效的,其实不会加速,固然,能够经由过程以下语句设置为NOFORCELOGGING。
Alterdatabasenoforcelogging;
是不是开启了FORCELOGGING,能够用以下语句检察
SQL>selectforce_loggingfromv$database;
怎样制止利用特定索引
在良多时分,Oracle会毛病的利用索引而招致效力的分明下落,我们可使用一点点技能而制止利用不应利用的索引,如:
表test,有字段a,b,c,d,在a,b,c上创建团结索引inx_a(a,b,c),在b上独自创建了一个索引Inx_b(b)。
在一般情形下,wherea=?andb=?andc=?会用到索引inx_a,
whereb=?会用到索引inx_b
可是,wherea=?andb=?andc=?groupbyb会用到哪一个索引呢?在剖析数据不准确(很长工夫没有剖析)或基本没有剖析数据的情形下,oracle常常会利用索引inx_b。经由过程实行企图的剖析,这个索引的利用,将年夜年夜泯灭查询工夫。
固然,我们能够经由过程以下的技能制止利用inx_b,而利用inx_a。
wherea=?andb=?andc=?groupbyb||--假如b是字符
wherea=?andb=?andc=?groupbyb+0--假如b是数字
经由过程如许复杂的改动,常常能够是查询工夫提交良多倍
固然,我们也能够利用no_index提醒,信任良多人没有效过,也是一个不错的办法:
select/*+no_index(t,inx_b)*/*fromtestt
wherea=?andb=?andc=?groupbyb
Oracle甚么时分会利用腾跃式索引扫描
这是9i的一个新特征腾跃式索引扫描(IndexSkipScan).
比方表有索引index(a,b,c),当查询前提为
whereb=?的时分,大概会利用到索引index(a,b,c)
如,实行企图中呈现以下企图:
INDEX(SKIPSCAN)OFTEST_IDX(NON-UNIQUE)
Oracle的优化器(这里指的是CBO)能对查询使用IndexSkipScans最少要有几个前提:
1优化器以为是符合的。
2索引中的前导列的独一值的数目能满意必定的前提(如反复值良多)。
3优化器要晓得前导列的值散布(经由过程剖析/统计表失掉)。
4符合的SQL语句
等。
怎样创立利用假造索引
可使用nosegment选项,如
createindexvirtual_index_nameontable_name(col_name)nosegment;
假如在哪一个session必要测试假造索引,能够使用隐含参数来处置
altersessionset"_use_nosegment_indexes"=true;
就能够使用explainplanforselect……来看假造索引的效果
使用@$ORACLE_HOME/rdbms/admin/utlxpls检察实行企图
最初,依据必要,我们能够删除假造索引,如一般索引一样
dropindexvirtual_index_name;
注重:假造索引并非物理存在的,以是假造索引其实不同等于物理索引,不要用主动跟踪往测试假造索引,由于那是实践实行的效果,是用不到假造索引的。
如何监控无用的索引
Oracle9i以上,能够监控索引的利用情形,假如一段工夫内没有利用的索引,一样平常就是无用的索引
语法为:
入手下手监控:alterindexindex_namemonitoringusage;
反省利用形态:select*fromv$object_usage;
中断监控:alterindexindex_namenomonitoringusage;
固然,假如想监控全部用户下的索引,能够接纳以下的剧本:
setheadingoff
setechooff
setfeedbackoff
setpages10000
spoolstart_index_monitor.sql
SELECTalterindex||owner||.||index_name||monitoringusage;
FROMdba_indexes
WHEREowner=USER;
spooloff
setheadingon
setechoon
setfeedbackon
------------------------------------------------
setheadingoff
setechooff
setfeedbackoff
setpages10000
spoolstop_index_monitor.sql
SELECTalterindex||owner||.||index_name||nomonitoringusage;
FROMdba_indexes
WHEREowner=USER;
spooloff
setheadingon
setechoon
setfeedbackon
怎样能流动我的实行企图
可使用OUTLINE来流动SQL语句的实行企图
用以下语句能够创立一个OUTLINE
CreateoereplaceoutlineOutLn_Nameon
SelectCol1,Col2fromTable
where……
假如要删除Outline,能够接纳
DropOutlineOutLn_Name;
关于已创立了的OutLine,寄存在OUTLN用户的OL$HINTS表上面
关于有些语句,你可使用updateoutln.ol$hints来更新outline
如updateoutln.ol$hints(ol_name,TEST1,TEST2,TEST2,TEST1)
whereol_namein(TEST1,TEST2);
如许,你就把Test1OUTLINE与Test2OUTLINE交换了
假如想使用已存在的OUTLINE,必要设置以下参数
Altersystem/sessionsetQuery_rewrite_enabled=true
Altersystem/sessionsetuse_stored_outlines=true
v$sysstat中的class分离代表甚么
统计种别
1代表事例举动
2代表Redobuffer举动
4代表锁
8代表数据缓冲举动
16代表OS举动
32代表并行举动
64代表表会见
128代表调试信息
怎样杀失落特定的数据库会话
Altersystemkillsessionsid,serial#;
大概
altersystemdisconnectsessionsid,serial#immediate;
在win上,还能够接纳oracle供应的orakill杀失落一个线程(实在就是一个Oracle历程)
在Linux/Unix上,能够间接使用kill杀失落数据库历程对应的OS历程
怎样疾速查找锁与锁守候
数据库的锁是对照泯灭资本的,出格是产生锁守候的时分,我们必需找到产生守候的锁,有大概的话,杀失落该历程。
这个语句将查找到数据库中一切的DML语句发生的锁,还能够发明,任何DML语句实在发生了两个锁,一个是表锁,一个是行锁。
能够经由过程altersystemkillsession‘sid,serial#’来杀失落会话
SELECT/*+rule*/s.username,
decode(l.type,TM,TABLELOCK,
TX,ROWLOCK,
NULL)LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
FROMv$sessions,v$lockl,dba_objectso
WHEREl.sid=s.sid
ANDl.id1=o.object_id(+)
ANDs.usernameisNOTNULL
假如产生了锁守候,我们大概更想晓得是谁锁了表而引发谁的守候
以下的语句能够查询到谁锁了表,而谁在守候。
SELECT/*+rule*/lpad(,decode(l.xidusn,0,3,0))||l.oracle_usernameUser_name,
o.owner,o.object_name,o.object_type,s.sid,s.serial#
FROMv$locked_objectl,dba_objectso,v$sessions
WHEREl.object_id=o.object_id
ANDl.session_id=s.sid
ORDERBYo.object_id,xidusnDESC
以上查询了局是一个树状布局,假如有子节点,则暗示有守候产生。假如想晓得锁用了哪一个回滚段,还能够联系关系到V$rollname,个中xidusn就是回滚段的USN
怎样无效的删除一个年夜表(extent数良多的表)
一个有良多(100k)extent的表,假如只是复杂地用droptable的话,会很大批损耗CPU(Oracle要对fet$、uet$数据字典举行操纵),大概会用上几天的工夫,较好的办法是分屡次删除extent,以加重这类损耗:
1.truncatetablebig-tablereusestorage;
2.altertablebig-tabledeallocateunusedkeep2000m(本来巨细的n-1/n);
3.altertablebig-tabledeallocateunusedkeep1500m;
....
4.droptablebig-table;
怎样压缩一时数据文件的巨细
9i以下版本接纳
ALTERDATABASEDATAFILEfilenameRESIZE100M相似的语句
9i以上版本接纳
ALTERDATABASETEMPFILEfilenameRESIZE100M
注重,一时数据文件在利用时,一样平常不克不及压缩,除非封闭数据库或断开一切会话,中断对一时数据文件的利用。
怎样清算一时段
可使用以下举措
1、利用以下语句检察一下认谁在用一时段
SELECTusername,sid,serial#,sql_address,machine,program,
tablespace,segtype,contents
FROMv$sessionse,v$sort_usagesu
WHEREse.saddr=su.session_addr
2、那些正在利用一时段的历程
SQL>Altersystemkillsessionsid,serial#;
3、把TEMP表空间回缩一下
SQL>AltertablespaceTEMPcoalesce;
还可使用诊断事务
1、断定TEMP表空间的ts#
SQL>selectts#,nameFROMv$tablespace;
TS#NAME
-----------------------
0SYSYEM
1RBS
2USERS
3*TEMP
……
2、实行清算操纵
altersessionseteventsimmediatetracenameDROP_SEGMENTSlevelTS#+1
申明:
temp表空间的TS#为3*,SoTS#+1=4
假如想扫除一切表空间的一时段,则
TS#=2147483647
怎样dump数据库外部布局,如下面显现的把持文件的布局
罕见的有
1、剖析数据文件块,转储数据文件n的块m
altersystemdumpdatafilenblockm
2、剖析日记文件
altersystemdumplogfilelogfilename;
3、剖析把持文件的内容
altersessionseteventsimmediatetracenameCONTROLFlevel10
4、剖析一切数据文件头
altersessionseteventsimmediatetracenameFILE_HDRSlevel10
5、剖析日记文件头
altersessionseteventsimmediatetracenameREDOHDRlevel10
6、剖析体系形态,最好每10分钟一次,做三次对照
altersessionseteventsimmediatetracenameSYSTEMSTATElevel10
7、剖析历程形态
altersessionseteventsimmediatetracenamePROCESSSTATElevel10
8、剖析LibraryCache的具体情形
altersessionseteventsimmediatetracenamelibrary_cachelevel10
怎样取得一切的事务代码
事务代码局限一样平常从10000to10999,以以下出了这个局限的事务代码与信息
SETSERVEROUTPUTON
DECLARE
err_msgVARCHAR2(120);
BEGIN
dbms_output.enable(1000000);
FORerr_numIN10000..10999
LOOP
err_msg:=SQLERRM(-err_num);
IFerr_msgNOTLIKE%Message||err_num||notfound%THEN
dbms_output.put_line(err_msg);
ENDIF;
ENDLOOP;
END;
/
在Unix体系上,事务信息放在一个文本文件里
$ORACLE_HOME/rdbms/mesg/oraus.msg
能够用以下剧本检察事务信息
event=10000
while[$event-ne10999]
do
event=`expr$event+1`
oerrora$event
done
关于已确保的/正在跟踪的事务,能够用以下剧本取得
SETSERVEROUTPUTON
DECLARE
l_levelNUMBER;
BEGIN
FORl_eventIN10000..10999
LOOP
dbms_system.read_ev(l_event,l_level);
IFl_level>0THEN
dbms_output.put_line(Event||TO_CHAR(l_event)||
issetatlevel||TO_CHAR(l_level));
ENDIF;
ENDLOOP;
END;
/
甚么是STATSPACK,我怎样利用它?
Statspack是Oracle8i以上供应的一个十分好的功能监控与诊断工具,基础上全体包括了BSTAT/ESTAT的功效,更多的信息
能够参考附带文档$ORACLE_HOME/rdbms/admin/spdoc.txt。
安装Statspack:
cd$ORACLE_HOME/rdbms/admin
sqlplus"/assysdba"@spdrop.sql--卸载,第一次能够不必要
sqlplus"/assysdba"@spcreate.sql--必要依据提醒输出表空间名
利用Statspack:
sqlplusperfstat/perfstat
execstatspack.snap;--举行信息搜集统计,每次运转都将发生一个快照号
--取得快照号,必需要有两个以上的快照,才干天生报表
selectSNAP_ID,SNAP_TIMEfromSTATS$SNAPSHOT;
@spreport.sql--输出必要检察的入手下手快照号与停止快照号
其他相干剧本s:
spauto.sql-使用dbms_job提交一个功课,主动的举行STATPACK的信息搜集统计
sppurge.sql-扫除一段局限内的统计信息,必要供应入手下手快照与停止快照号
sptrunc.sql-扫除(truncate)一切统计信息
即使对于MySQL的商业化的企业版来说,也没有高昂的许可证成本,当你将其与像甲骨文和微软之类的大型专有商业数据库比较的话。 having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。 你觉得我的非分区索引无法对起子分区,你可以提醒我一下呀!没有任何的提醒,直接就变成了非分区表。不知道这算不算一个bug。大家也可以试试。 发几份SQL课件,以飨阅者 不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理? 光写几个SQL实在叫无知。 连做梦都在想页面结构是怎么样的,绝非虚言 比如日志传送、比如集群。。。 只能告诉你,学好数据库语言和原理,多见识几种数据库软件,比一棵树上吊死要好。 对于微软系列的东西除了一遍遍尝试还真没有太好的办法
页:
[1]