一些经常使用的脚本2
删除某个正在连接的用户
SQL> select username,sid,serial# from v$session where username='CHARGE';
USERNAME SID SERIAL#
---------------------- ------ ----------
CHARGE 257 85
CHARGE 258 96
SQL> alter system kill session '257,85';
System altered.
SQL> alter system kill session '258,96';
System altered.
SQL> drop user charge cascade;
User dropped.
==============================================================
expdp,impdp的使用,只能在服务器端使用,不能在客户端使用
1)创建directory,并分配读写权限
sql> conn / as sysdba
sql> create directory dump_test as '/home/oralce'
sql> grant read,write on directory dump_test
2)导出方案
expdp username/password directory=dump_test dumpfile=test.dmp ---加上 parallel=4增加导出速度
3)导出表
expdp username/password directory=dump_test dumpfile=test.dmp tables=t1,t2,t3
4)导出过程
expdp username/password directory=dump_test dumpfile=test.dmp include=procedure
5)导出部分函数
expdp username/password directory=dump_test dumpfile=test.dmp include=function:\"=\'f_geta\'\"
6)导入dmp文件
impdp username/password directory=dump_test dumpfile=test.dmp
删除directory ---指定的文件夹不会被删除
drop directory dump_test
==============================================================
捕获alter命令的ddl触发器
create or replace trigger trg_dbalter
after ddl on database
/*
create table dbalter
(
login_user varchar2(64),
ipaddress varchar2(64),
schema_user varchar2(64),
schema_object varchar2(64),
schema_type varchar2(64),
ddl_time varchar2(64),
ddl_sql varchar2(4000)
)
*/
declare
sql_text ora_name_list_t;
state_sql varchar2(4000);
vs_ip varchar2(64);
begin
begin
for i in 1 .. ora_sql_txt(sql_text) loop
state_sql := state_sql || sql_text(i);
end loop;
exception
when others then
null;
end;
select SYS_CONTEXT('USERENV', 'IP_ADDRESS') into vs_ip from dual;
insert into dbalter
(login_user,
ipaddress,
schema_user,
schema_object,
schema_type,
ddl_time,
ddl_sql)
values
(ora_login_user,
vs_ip, --ora_client_ip_address,
ora_dict_obj_owner,
ora_dict_obj_name,
ora_dict_obj_type,
sysdate,
state_sql);
exception
when others then
dbms_output.put_line('捕获ddl语句异常错误: ' || sqlerrm);
end;
==============================================================
提高大表数据处理的综合分析
①、通过MERGE INTO更新表比采用循环快(Oracle建议能用一条SQL语句完成就不要使用多条)
②、在必须要通过循环处理的更新,建议先用游标将要更新的内容及ROWID取出来,后面根据ROWID来更新
③、在大表大循环中进行更新,最好不要采用找索引方式,而采用ROWID方式
④、插入、更新、删除表内容采用NOLOGGING方式比LOGGING方式快很多
⑤、在插入表时,建议采用APPEND提示来处理提高速度
⑥、利用了索引,并不一定是最好的选择,相反不利用索引有时候会更快
⑦、能一次处理,就不要多次处理,能交给Oracle自己做的,就不要自己做
⑧、并行,并不是总能提高处理速度,有时候会更慢
⑨、在循环中将插入的记录先保存为数组,然后用FORALL循环插入能提高插入速度
⑩、当记录比较多的时候可以考虑分段提交来提高速度
==============================================================
查看临时表空间
dba_temp_files
==============================================================
导出带查询条件的表
expcharge/charge@chargefile=charge.dmp tables=('hotelchargelist') query=\"where id\<10000\"
==============================================================
在Shared Server中的Process 和Oracle 中的Session不是一一对应的,Shared Server中的Process 一个对应着Oracle 中的一个或者一个以上的Session。在dedicated server机器上试验了
数据库的session和操作系统process是对应的
即表示一个session对应一个process,但是一个process未必对应一个session
sesssion 是会话,客户端与服务器联接上,便是一个session
process 是进程,
查询当前连接数
select count(1) from v$process
to_char(0.12,'999999990.99')
避免出现.12的0被去掉的情况
==============================================================
查询目前连接数
show parameter processes;
更改系统连接数
alter system set processes=1000 scope=spfile;
==============================================================
lsnrctl reload
reload命令会重新读取listener.ora的内容,这个命令让我们在不停止监听器的情况下,改变监听器的配置
==============================================================
出现数据文件介质错误的情况ORA-01157
在mount状态:
归档的话:
SQL>alter database datafile 'I:\ORADATA\EXAMORA\TEST01.DBF' offline;
非归档的话:
SQL>alter database datafile 'I:\ORADATA\EXAMORA\TEST01.DBF' offline drop;
==============================================================
处理回滚表空间过大
创建一个新的回滚段:
sql>CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE '/opt/oracle/oradata/oradev/UNDOTBS2.dbf' SIZE 50M
切换回滚段:
sql>alter system set undo_tablespace=undotbs2 scope=spfile;
sql>shutdown immediate
sql>startup
sql>drop tablespace undotbs1 including contents and datafiles;
==============================================================
更改表的表空间
SELECT 'ALTER TABLE '||TABLE_NAME ||' MOVE TABLESPACE charge ;' FROM USER_TABLES ;
==============================================================
---oracle执行计划的一些概念:
Rowid:系统给oracle数据的每行附加的一个伪列,包含数据表名称,数据库id,存储数据库id以及一个流水号等信息,rowid在行的生命周期内唯一。
Recursive sql:为了执行用户语句,系统附加执行的额外操作语句,譬如对数据字典的维护等。
Row source(行源):oracle执行步骤过程中,由上一个操作返回的符合条件的行的集合。
Predicate(谓词):where后的限制条件。
Driving table(驱动表):又称为连接的外层表,主要用于嵌套与hash连接中。一般来说是将应用限制条件后,返回较少行源的表作为驱动表。在后面的描述中,将driving table称为连接操作的row source 1。
Probed table(被探查表):连接的内层表,在我们从driving table得到具体的一行数据后,在probed table中寻找符合条件的行,所以该表应该为较大的row source,并且对应连接条件的列上应该有索引。在后面的描述中,一般将该表称为连接操作的row source 2.
Concatenated index(组合索引):一个索引如果由多列构成,那么就称为组合索引,组合索引的第一列为引导列,只有谓词中包含引导列时,索引才可用。
可选择性:表中某列的不同数值数量/表的总行数如果接近于1,则列的可选择性为高。
Oracle访问数据的存取方法:
Full table scans, FTS(全表扫描):通过设置db_block_multiblock_read_count可以设置一次IO能读取的数据块个数,从而有效减少全表扫描时的IO总次数,也就是通过预读机制将将要访问的数据块预先读入内存中。只有在全表扫描情况下才能使用多块读操作。
Table access by rowed(通过rowid存取表,rowid lookup):由于rowid中记录了行存储的位置,所以这是oracle存取单行数据的最快方法。
Index scan(索引扫描index lookup):在索引中,除了存储每个索引的值外,索引还存储具有此值的行对应的rowid值,索引扫描分两步1,扫描索引得到rowid;2,通过rowid读取具体数据。每步都是单独的一次IO,所以如果数据经限制条件过滤后的总量大于原表总行数的5%-10%,则使用索引扫描效率下降很多。而如果结果数据能够全部在索引中找到,则可以避免第二步操作,从而加快检索速度。
根据索引类型与where限制条件的不同,有4种类型的索引扫描:
l Index unique scan(索引唯一扫描):存在unique或者primary key的情况下,返回单个rowid数据内容。
l Index range scan(索引范围扫描):1,在唯一索引上使用了range操作符(>,<,<>,>=,<=,between);2,在组合索引上,只使用部分列进行查询;3,对非唯一索引上的列进行的查询。
l Index full scan(索引全扫描):需要查询的数据从索引中可以全部得到。
l Index fast full scan(索引快速扫描):与index full scan类似,但是这种方式下不对结果进行排序。
目前为止,典型的连接类型有3种:
l Sort merge join(SMJ排序-合并连接):首先生产driving table需要的数据,然后对这些数据按照连接操作关联列进行排序;然后生产probed table需要的数据,然后对这些数据按照与driving table对应的连接操作列进行排序;最后两边已经排序的行被放在一起执行合并操作。排序是一个费时、费资源的操作,特别对于大表。所以smj通常不是一个特别有效的连接方法,但是如果driving table和probed table都已经预先排序,则这种连接方法的效率也比较高。
l Nested loops(NL嵌套循环):连接过程就是将driving table和probed table进行一次嵌套循环的过程。就是用driving table的每一行去匹配probed table 的所有行。Nested loops可以先返回已经连接的行,而不必等待所有的连接操作处理完成才返回数据,这可以实现快速的响应时间。
l Hash join(哈希连接):较小的row source被用来构建hash table与bitmap,第二个row source用来被hashed,并与第一个row source生产的hash table进行匹配。以便进行进一步的连接。当被构建的hash table与bitmap能被容纳在内存中时,这种连接方式的效率极高。但需要设置合适的hash_area_size参数且只能用于等值连接中。
l Cartesian product(笛卡尔积):表的每一行依次与另外一表的所有行匹配。
==============================================================
---打印出来
set serverout on
dbms_output.putline('aaa');
导入论坛 引用链接 收藏 分享给好友 推荐到圈子 管理 举报
TAG:


