每天都要进步!

一些经常使用的脚本2

上一篇 / 下一篇  2008-06-27 15:06:14

删除某个正在连接的用户
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:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-09-05  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 316
  • 日志数: 14
  • 建立时间: 2008-05-09
  • 更新时间: 2008-08-29

RSS订阅

Open Toolbar