oracle常用技巧.docx
《oracle常用技巧.docx》由会员分享,可在线阅读,更多相关《oracle常用技巧.docx(17页珍藏版)》请在冰豆网上搜索。
oracle常用技巧
1移动表空间命令
altertableSP_COUNT_MON_02movetablespacetrantbs1
2源串like‘%子串%’与instr(源串,子串)>0等价
在预处理get_kor_msisdn将like‘%子串%’静态sql改为动态sql
instr(源串,:
v1(子串))>0
3查找表结构应该相同的表
今天写了下面这一段SQL语句,在写之前总觉得有更简便的方法,可就是没有想出来:
SELECT
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(TABLE_NAME,'0','#'),
'1','#'),'2','#'),'3','#'),'4','#')
,'5','#'),'6','#'),'7','#'),'8','#'),'9','#') PATTERN_NAME
FROMUSER_TABLES
下班时坐地铁,突然想到了Translate函数,原来可以这么简单:
SELECT
TRANSLATE(TABLE_NAME,'0123456789','##########')PATTERN_NAME
FROMUSER_TABLES
我写这个SQL是用来找出一些表结构应当相同的表,最终的SQL应当如下:
SELECTTABLE_NAMEFROMUSER_TABLES
WHERETRANSLATE(TABLE_NAME,'0123456789','##########')IN
(SELECT
TRANSLATE(TABLE_NAME,'0123456789','##########')PATTERN_NAME
FROMUSER_TABLES
GROUPBYTRANSLATE(TABLE_NAME,'0123456789','##########')
HAVINGCOUNT(*)>1)
看来选择最佳的方法是很必要的.
4exp/imp使用技巧
4.1exp命令
exp用户名/密码@oracle_sidfile=表名.dmptables=表名
默认情况下,即导数据又导表结构(full=y)
exp用户名/密码@oracle_sidrows=nfile=表名.dmptables=表名
只到表结构不导数据
exp用户名/密码@oracle_sidrows=yfile=表名.dmptables=表名
导表结构也导数据
4.2imp命令
Imp用户名/密码@oracle_sidfile=表名.dmptables=表名
默认情况下,即导数据又导表结构(createtable)如果数据里原来有这个表那么报错
Imp用户名/密码@oracle_sidignore=yfile=表名.dmptables=表名
只导入数据不修改表结构(createtable)
4.3.建立一个与现存数据库相同,但不包含数据的空库
对全库作俄Export或Import时,使用参数ROWS=N
例:
expsystem/managerfull=Yrows=Nfile=full.dmp
impsystem/managerfull=Yrows=Nfile=full.dmp
5like语句优化
简单说两句,具体看例子
1。
尽量不要使用like'%..%'
2。
对于like'..%..'(不以%开头),Oracle可以应用colunm上的index
3。
对于like'%...'的(不以%结尾),可以利用reverse+functionindex的形式,变化成like'..%'
代码:
--'建测试表和Index,注意,重点在于带reverse的functionindex。
同时,一定要使用CBO才行……
sys@mescp>selectreverse('123')fromdual;REVERSE('123')
--------------------------------
321
1rowselected.
sys@mescp>createtabletest_likeasselectobject_id,object_namefromdba_objects;
Tablecreated.
sys@mescp>createindextest_like__nameontest_like(object_name);
Indexcreated.
sys@mescp>createindextest_like__name_reverseontest_like(reverse(object_name));
Indexcreated.
sys@mescp>analyzetabletest_likecomputestatisticsfortableforallindexes;
Tableanalyzed.
sys@mescp>setautotracetraceexp
--'常量开头的like,会利用index,没问题……'
sys@mescp>select*fromtest_likewhereobject_namelikeAS%';
ExecutionPlan
----------------------------------------------------------
0SELECTSTATEMENTOptimizer=CHOOSE(Cost=2Card=655Bytes=15720)
10TABLEACCESS(BYINDEXROWID)OF'TEST_LIKE'(Cost=2Card=655Bytes=15720)
21INDEX(RANGESCAN)OF'TEST_LIKE__NAME'(NON-UNIQUE)(Cost=2Card=118)
--'开头和结尾都是%,对不起,很难优化'
sys@mescp>select*fromtest_likewhereobject_namelike'%%';
ExecutionPlan
----------------------------------------------------------
0SELECTSTATEMENTOptimizer=CHOOSE(Cost=6Card=655Bytes=15720)
10TABLEACCESS(FULL)OF'TEST_LIKE'(Cost=6Card=655ytes=15720)
--'以常量结束,直接写的时候是不能应用index的'
sys@mescp>select*fromtest_likewhereobject_namelike'%S';
ExecutionPlan
----------------------------------------------------------
0SELECTSTATEMENTOptimizer=CHOOSE(Cost=6Card=655Bytes=15720)
10TABLEACCESS(FULL)OF'TEST_LIKE'(Cost=6Card=655Bytes=15720)
--'以常量结束的,加个reverse函数,又可以用上index了'
sys@mescp>select*fromtest_likewherereverse(object_name)likereverse('%AS');
ExecutionPlan
----------------------------------------------------------
0SELECTSTATEMENTOptimizer=CHOOSE(Cost=2Card=655Bytes=15720)
10TABLEACCESS(BYINDEXROWID)OF'TEST_LIKE'(Cost=2Card=655Bytes=15720)
21INDEX(RANGESCAN)OF'TEST_LIKE__NAME_REVERSE'(NON-UNIQUE)(Cost=2Card=118)
6sqlpluscopy命令在两个数据库间转移数据
本文介绍了如何利用sqlpluscopy命令在两个数据库间转移数据
无需用到dblink,两个数据库间不需直接通讯,当然,需要有一个client段能同时以sqlplus连接到两个数据库
问题的提出
论坛上有人提出这样的问题:
假设有两个数据库,分别处于两个不同的网但有一个客户机安了两块网卡可以同时连到两个数据库请问如果不通过在客户机上建中转表,有没有办法实现这两个数据库中从某一个往另一个拷表.
问题的解答
可以使用sqlplus的copy命令来达到。
copy的命令的这个样子的:
usage:
COPYFROMTO{()}USING:databasestring,e.g.,scott/tiger@d:
chicago-mktg
:
ONEofthekeywords:
APPEND,CREATE,INSERTorREPLACE
:nameofthedestinationtable
:
acomma-separatedlistofdestinationcolumnaliases
:
anyvalidSQLSELECTstatement
实际上写的应该很清楚了,按照那样的语法就可以完成了。
它相当于从FROMDB根据把数据取到缓冲区,再根据在TODB中创建table(create)或者重新创建table(replace),然后把数据insert或者appendinsert到TODB的table中。
Ø有一点需要注意的,通常会设置高一点的arraysize,以便使sqlplus与DB的交互减少,以达到更好的性能。
Ø另外,在写databasestring时,可以不必写出密码,sqlplus会稍后会提示你输入密码。
一个完整的例子:
sqlplus/nolog
SQL>setarraysize5000
SQL>copyfromserol/luo@mescptoserol/luo@ractestcreatetest_copy_tableusingselect*fromdba_objects;
Arrayfetch/bindsizeis5000.(arraysizeis5000)
Willcommitwhendone.(copycommitis0)
Maximumlongsizeis5000.(longis5000)
SQLRCNincpytblfailed:
-2120
TableTEST_COPY_TABLEcreated.
12579rowsselectedfromserol@mescp.
12579rowsinsertedintoTEST_COPY_TABLE.
12579rowscommittedintoTEST_COPY_TABLEatserol@ractest.
7查看数据库使用空间
selectff.stablespace_name,
ff.btotal,
(ff.b-fr.b)usage,
fr.bfree,
round((ff.b-fr.b)/ff.b*100)||'%'usagep
from(selecttablespace_names,sum(bytes)/1024/1024/1024b
fromdba_data_files
groupbytablespace_name)ff,
(selecttablespace_names,sum(bytes)/1024/1024/1024b
fromdba_free_space
groupbytablespace_name)fr
whereff.s=fr.s
8查看表空间使用情况
SQL>coltablespaceformata20
SQL>select
b.file_id文件ID号,
b.tablespace_name表空间名,
b.bytes/1024总计大小,
(b.bytes-sum(nvl(a.bytes,0)))/1024已使用,
sum(nvl(a.bytes,0))/1024剩余空间,
(b.bytes-sum(nvl(a.bytes,0)))/(b.bytes)*100剩余百分比
fromdba_free_spacea,dba_data_filesb
wherea.file_id=b.file_id
groupbyb.tablespace_name,b.file_id,b.bytes
orderbyb.file_id;
9成批索引或表移动表空间
select'alterindex'||index_name||'rebuildtablespaceinfoidx03nologging;'fromuser_indexes
wheretable_namelike'LOAD%'
select'altertable'||table_name||'movetablespaceinfodat03nologging;'fromuser_tables
wheretable_namelike'LOAD%'
10改变表名
altertableorder_info_inc_arenametoorder_info_inc_b;
11改变列名
altertabletrenamecolumnoldtonew;
12查看session信息
SELECTA.OWNER,
A.OBJECT_NAME,
B.XIDUSN,
B.XIDSLOT,
B.XIDSQN,
B.SESSION_ID,
B.ORACLE_USERNAME,
B.OS_USER_NAME,
B.PROCESS,
B.LOCKED_MODE,
C.MACHINE,
C.STATUS,
C.SERVER,
C.SID,
C.SERIAL#,
C.PROGRAM
FROMALL_OBJECTSA,
V$LOCKED_OBJECTB,
V$SESSIONC
WHERE(A.OBJECT_ID=B.OBJECT_ID)
AND(B.PROCESS=C.PROCESS)
ORDERBY1,2;
13打印输出信息
出现下面的错误怎么办:
ORA-20000:
ORU-10027:
bufferoverflow,limitof2000bytes
ORA-20000:
ORU-10027:
bufferoverflow,limitof2000bytes问题的解决
方法1:
setserveroutputonsize10000000
方法2:
execdbms_output.enable(999999999999999999999);
14获取对象创建语句
dbroam@SETTLEDB>Setpagesize1000;
dbroam@SETTLEDB>Setlinesize1000;
dbroam@SETTLEDB>setlong2000;
dbroam@SETTLEDB>selectdbms_metadata.get_ddl('TABLE','DT_R_OTHER_PARTY')fromdual;
dbroam@SETTLEDB>selectdbms_metadata.get_ddl('TABLE','DT_R_OTHER_PARTY')fromdual;
dbroam@SETTLEDB>selectdbms_metadata.get_ddl('FUNCTION','IS_NEGATIVE')fromdual;
dbroam@SETTLEDB>selectdbms_metadata.get_ddl('PROCEDURE','P_SP1_OTHER_SETTLE')fromdual;
dbroam@SETTLEDB>selectdbms_metadata.get_ddl('DB_LINK','BILL_LINK')fromdual;
dbroam@SETTLEDB>selectdbms_metadata.get_ddl('VIEW','CFG_M_CM_INFO')fromdual;
dbroam@SETTLEDB>selectdbms_metadata.get_ddl('TABLESPACE','C001_1')fromdual;
dbroam@SETTLEDB>selectdbms_metadata.get_ddl('PACKAGE','SG_IHASH')fromdual;
dbroam@SETTLEDB>selectdbms_metadata.get_ddl('TRIGGER','QD_LOG_BUR')fromdual;
dbroam@SETTLEDB>selectdbms_metadata.get_ddl('SYNONYM','CHINA_MSC')fromdual;
dbroam@SETTLEDB>selectdbms_metadata.get_ddl('USER','DBROAM')fromdual;
基本上用到的语法如下:
a.获取单个的建表和建索引的语法
setheadingoff;
setechooff;
Setpages999;
setlong90000;
spoolDEPT.sql
selectdbms_metadata.get_ddl('TABLE','DEPT','SCOTT')fromdual;
selectdbms_metadata.get_ddl('INDEX','DEPT_IDX','SCOTT')fromdual;
spooloff;
b.获取一个SCHEMA下的所有建表和建索引的语法,以scott为例:
setpagesize0
setlong90000
setfeedbackoff
setechooff
spoolscott_schema.sql
connectscott/tiger;
SELECTDBMS_METADATA.GET_DDL('TABLE',u.table_name)
FROMUSER_TABLESu;
SELECTDBMS_METADATA.GET_DDL('INDEX',u.index_name)
FROMUSER_INDEXESu;
spooloff;
c. 获取某个SCHEMA的建全部存储过程的语法
connectbrucelau/brucelau;
spoolprocedures.sql
select
DBMS_METADATA.GET_DDL('PROCEDURE',u.object_name)
from
user_objectsu
where
object_type='PROCEDURE';
spooloff;
另:
dbms_metadata.get_ddl('TABLE','TAB1','USER1')
三个参数中,第一个指定导出DDL定义的对象类型(此例中为表类型),第二个是对象名(此例中即表名),第三个是对象所在的用户名。
setechooff
setfeedbackoff
setheadingoff
spoolabc.log
select*fromtest;
spooloff
15获取存储过程,函数,包的创建语句
Setpagesize1000;
Setlinesize1000;
selecttextfromall_sourcewhereowner=userandname=upper('p_sp1_other_settle');
16计算某个表所占空间大小
selectsegment_name,sum(bytes)/1024/1024/1024g
fromdba_segments
whereowner=user
groupbysegment_name
17获取正在执行sql
selecta.username,a.sid,b.sql_textfromv$sessiona,v$sqlareabwherea.sql_address=b.address
18移动分区表
移分区表:
SELECT'altertable'||table_owner||'.'||table_name||'movepartition'||partition_name||'tablespace新表空间名parallel;'
fromdba_tab_partitions
WHEREtablespace_name='表空间名'
groupbytable_name,table_owner,partition_name
重建分区索引:
SELECT'alterindex'||owner||'.'||segment_name||'rebuildpartition'||partition_name||'tablespace新表空间名parallel;'
select*
FROMDBA_SEGMENTS
WHERETABLESPACE_name='表空间名
展开阅读全文
相关搜索