Oracle PLSQL_DBA

 

 
1.11捕捉運行很久的SQL
column username format a12
column opname format a16
column progress format a8
select username,sid,opname,
round(sofar*100 / totalwork,0) || '%' as progress,
time_remaining,sql_text
from v$session_longops , v$sql
where time_remaining <> 0
and sql_address = address
and sql_hash_value = hash_value
1.12查看還沒提交的事務
select * from v$locked_object;
select * from v$transaction
1.13查找object爲哪些進程所用
select
p.spid,
s.sid,
s.serial# serial_num,
s.username user_name,
a.type object_type,
s.osuser os_user_name,
a.owner,
a.object object_name,
decode(sign(48 - command),
1,
to_char(command), 'Action Code #' || to_char(command) ) action,
p.program oracle_process,
s.terminal terminal,
s.program program,
s.status session_status
from v$session s, v$access a, v$process p
where s.paddr = p.addr and
s.type = 'USER' and
a.sid = s.sid and
a.object='SUBSCRIBER_ATTR'
order by s.username, s.osuser
1.14回滾段查看
select rownum, sys.dba_rollback_segs.segment_name Name, v$rollstat.extents
Extents, v$rollstat.rssize Size_in_Bytes, v$rollstat.xacts XActs,
v$rollstat.gets Gets, v$rollstat.waits Waits, v$rollstat.writes Writes,
sys.dba_rollback_segs.status status from v$rollstat, sys.dba_rollback_segs,
v$rollname where v$rollname.name(+) = sys.dba_rollback_segs.segment_name and
v$rollstat.usn (+) = v$rollname.usn order by rownum
15。耗資源的進程(top session)
select s.schemaname schema_name, decode(sign(48 - command), 1,
to_char(command), 'Action Code #' || to_char(command) ) action, status
session_status, s.osuser os_user_name, s.sid, p.spid , s.serial# serial_num,
nvl(s.username, '[Oracle process]') user_name, s.terminal terminal,
s.program program, st.value criteria_value from v$sesstat st, v$session s , v$process p
where st.sid = s.sid and st.statistic# = to_number('38') and ('ALL' = 'ALL'
or s.status = 'ALL') and p.addr = s.paddr order by st.value desc, p.spid asc, s.username asc, s.osuser asc
1.15查看等待(wait)情況
SELECT v$waitstat.class, v$waitstat.count count, SUM(v$sysstat.value) sum_value
FROM v$waitstat, v$sysstat WHERE v$sysstat.name IN ('db block gets',
'consistent gets') group by v$waitstat.class, v$waitstat.count
1.16查看sga情況
SELECT NAME, BYTES FROM SYS.V_$SGASTAT ORDER BY NAME ASC
1.17查看catched object
SELECT owner, name, db_link, namespace,
type, sharable_mem, loads, executions,
locks, pins, kept FROM v$db_object_cache
1.18發現無效的對象
col "owner" format a12
col "object" format a20
col "otype" format a12
col "change date" format a20
select substr(owner,1,12) "owner",
 substr(object_name,1,20) "object" ,
 object_type "otype",
 to_char(last_ddl_time,’dd-mon-yyyy hh24:mm:ss’) "change date"
 from dba_objects
 where status<>’valid’
 order by 1,2
 1.19重新編譯所有的存儲過程,函數和程序包
 begin
 dbms_utility.compile_schema(‘gw’);
 end;
1.20v$sqlarea中找出最佔資源的查詢
select b.username username,a.disk_reads reads,
a.executions exec,
a.disk_reads/decode(a.executions,0,1,a.executions) rds_exec_ratio,
a.sql_text statement
from v$sqlarea a,dba_users b
where a.parsing_user_id=b.user_id
and a.disk_reads>100000
order by a.disk_reads desc
1.21v$sql中找出最佔資源的查詢
select * from (
 select sql_text,rank() over(order by buffer_gets desc) as rank_bufgets,
 to_char(100*ratio_to_report(buffer_gets) over(), 999.99) pct_bufgets
 from v$sql)
 where rank_bufgets<11
  (1)新建表空間
create tablespace USER_DATA1 datafile 
  'd:/oradata/user1_1.ora' size 512M, 
  'd:/oradata/user1_2.ora' size 512M, 
  'd:/oradata/user1_3.ora' size 512M, 
  'd:/oradata/user1_4.ora' size 512M, 
  'd:/oradata/user1_5.ora' size 512M, 
  'd:/oradata/user1_6.ora' size 512M 
  AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
  default storage (initial 128K next 2M pctincrease 0);
   --initial
爲空表的最小佔用的磁盤空間
   create tablespace ROLLBACK_DATA1 datafile 
  'd:/oradata/roll1_1.ora' size 512M

  'd:/oradata/roll1_2.ora' size 512M 
  AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
  default storage (initial 40M next 5M pctincrease 0);
(2)增加額外的數據文件到表空間中
 ALTER TABLESPACE "XYAPP" ADD DATAFILE 'E:/ORACLE/ORADATA/TEST/test.ora'  SIZE  5M
(3)修改表空間當前的數據文件 
ALTER DATABASE   DATAFILE 'E:/ORACLE/ORADATA/TEST/XYDATA.ORA' RESIZE  52M;
(4)刪除表空間及其包含的所有數據對象
   drop tablespace data including contents;
 (5)該數據物理文件名
   alter tablespace tbsdata rename datafile 'path/data_01.dbf' to 'path2/data01.dbf';
  alter database open;
 (6)回滾字段管理
     (1.)回滾段查詢
       SELECT SEGMENT_NAME,OWNER,
           TABLESPACE_NAME,SEGMENT_ID,FILE_ID,STATUS 
           FROM DBA_ROLLBACK_SEGS
     (2.)
回滾段刪除
          alter rollback segment 回滾段名 offline;
          drop rollback segment 
回滾段名;
     (3.)
回滾段建立
         create public rollback segment rb01 tablespace rollback_data1;
         --
建立新的回滾段,每個都一樣大,不同大小的回滾段沒有什麼意義,系統是隨機選擇的。
     --
建多少個,根據併發訪問用戶的多少,
     --
如果你們公司每天有50-100個人員使用Oracle系統開發的管理軟件,應該20個以上
     (4.)
使回滾字段有效  
 alter rollback segment rb01 online;
 (7)表空間與用戶捆綁用例
/** 爲避免用戶在S Y S T E M表空間中創建對象, S Y S T E M上的任何定額(定額允許在系統中生成對象)
        
必須被取消。**/
 alter user xyapp quota 0 on SYSTEM;
 CREATE USER ZBGL IDENTIFIED BY ZBGL default tablespace 
表空間名
 GRANT DBA TO ZBGL; 
 ALTER USER ZBGL DEFAULT TABLESPACE WXGL_DATA1 TEMPORARY TABLESPACE TEMPORARY_DATA;
 alter table acl_query move tablespace xyapp;
(8)查看錶空間空閒數據塊總和sum(bytes)與最大空閒數據塊max(bytes)
  select tablespace_name,sum(bytes),max(bytes) from dba_free_space group by tablespace_name;
3.1數據導出
1.       將數據庫TEST完全導出,用戶名system密碼manager導出到D:/daochu.dmp
exp system/manager@TEST file=d:/daochu.dmp full=y
2.       將數據庫中system用戶與sys用戶的表導出
exp system/manager@TEST file=d:/daochu.dmp owner=(system,sys)
3.       將數據庫中的表inner_notify、notify_staff_relat導出
exp aichannel/aichannel@TESTDB2 file= d:/data/newsmgnt.dmp tables=(inner_notify,notify_staff_relat)
4.       將數據庫中的表table1中的字段filed1以"00"打頭的數據導出
exp system/manager@TEST file=d:/daochu.dmp tables=(table1) query=/" where filed1 like '00%'/"
上面是常用的導出,對於壓縮,既用WinZip把dmp文件可以很好的壓縮。
也可以在上面命令後面 加上 compress=y 來實現。
3.2數據的導入
1 將D:/daochu.dmp 中的數據導入 TEST數據庫中。
   imp system/manager@TEST file=d:/daochu.dmp
   imp aichannel/aichannel@HUST full=y file=file= d:/data/newsmgnt.dmp ignore=y
 
上面可能有點問題,因爲有的表已經存在,然後它就報錯,對該表就不進行導入。
在後面加上 ignore=y 就可以了。
 
2 將d:/daochu.dmp中的表table1 導入
 imp system/manager@TEST file=d:/daochu.dmp tables=(table1)
 
基本上上面的導入導出夠用了。不少情況要先是將表徹底刪除,然後導入。
 
注重:
 操作者要有足夠的權限,權限不夠它會提示。
 數據庫時可以連上的。可以用tnsping TEST 來獲得數據庫TEST能否連上。
4.11查看錶空間的名稱及大小

 SQL> select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size
from dba_tablespaces t, dba_data_files d
where t.tablespace_name = d.tablespace_name
group by t.tablespace_name;
4.12查看錶空間物理文件的名稱及大小

 SQL> select tablespace_name, file_id, file_name,
round(bytes/(1024*1024),0) total_space
from dba_data_files
order by tablespace_name;
4.13查看回滾段名稱及大小

 SQL> select segment_name, tablespace_name, r.status,
(initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent,
max_extents, v.curext CurExtent
From dba_rollback_segs r, v$rollstat v
Where r.segment_id = v.usn(+)
order by segment_name ;
 
4.14、查看控制文件

 SQL> select name from v$controlfile;
4.15、查看日誌文件

 SQL> select member from v$logfile;
4.16、查看錶空間的使用情況

---使用DBA權限登陸

SQL> SELECT UPPER(F.TABLESPACE_NAME) "表空間名", D.TOT_GROOTTE_MB "表空間大小(M)", D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空間(M)", TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') "使用比", F.TOTAL_BYTES "空閒空間(M)", F.MAX_BYTES "最大塊(M)" FROM (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES, ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES FROM SYS.DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F, (SELECT DD.TABLESPACE_NAME, ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB FROM SYS.DBA_DATA_FILES DD GROUP BY DD.TABLESPACE_NAME) D WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME ORDER BY 4 DESC;
 
--查看錶空間是否具有自動擴展的能力
SQL> SELECT T.TABLESPACE_NAME,D.FILE_NAME,
D.AUTOEXTENSIBLE,D.BYTES,D.MAXBYTES,D.STATUS
FROM DBA_TABLESPACES T,DBA_DATA_FILES D
WHERE T.TABLESPACE_NAME =D.TABLESPACE_NAME
ORDER BY TABLESPACE_NAME,FILE_NAME;




4.17、查看數據庫庫對象

SQL>select owner, object_type, status, count(*) count# from all_objects group by owner, object_type, status;
4.18、查看數據對象(object)內容

SQL> select dbms_metadata.getdll(‘type’,’name’[,’owner’]) from dual;
4.19、查看當前用戶連接信息
SQL> select instance_name from v$instance;
用系統管理員,查看當前數據庫有幾個用戶連接:
SQL> select username,sid,serial# from v$session;
如果要停某個連接用
SQL> alter system kill session 'sid,serial#';
如果這命令不行,找它UNIX的進程數
SQL> select pro.spid from v$session ses,v$process pro where ses.sid=21 and ses.paddr=pro.addr;

說明:21是某個連接的sid數
然後用 kill 命令殺此進程號。
 
8、查看數據庫的版本

SQL>Select version FROM Product_component_version
Where SUBSTR(PRODUCT,1,6)='Oracle';
9、查看數據庫的創建日期和歸檔方式

SQL>Select Created, Log_Mode, Log_Mode From V$Database;
五、恢復應用服務器的OWA(同名設置)
當你安裝新的mod_plsql OWA包時,它們被放在SYS數據庫用戶模式下,這會爲應用服務器(Oracle Application Server)使用OAS PL/SQL cartridge組件帶來問題,如果你遇到這些問題並且想繼續使用OAS的PL/SQL cartridge組件,就必須重新建立一些同義詞,使得這些同義詞參照到OWA包。在源數據庫上建立同義詞的步驟如下: 
1.SYS帳戶在SQL*Plus中連接到數據庫
2.在SQL*Plus中運行下列命令,這將刪除所有在Oracle HTTP Server安裝進程中建立的OWA公共同義詞。
  drop public synonym OWA_CUSTOM;
  drop public synonym OWA_GLOBAL;
  drop public synonym OWA;
  drop public synonym HTF;
  drop public synonym HTP;
  drop public synonym OWA_COOKIE;
  drop public synonym OWA_IMAGE;
  drop public synonym OWA_OPT_LOCK;
  drop public synonym OWA_PATTERN;
  drop public synonym OWA_SEC;
  drop public synonym OWA_TEXT;
  drop public synonym OWA_UTIL;
  drop public synonym OWA_INIT;
  drop public synonym OWA_CACHE;
  drop public synonym WPG_DOCLOAD;
  
3.連接到OWA包的安裝模式oas_public,確保該用戶具有CREATE PUBLIC SYNONYM權限,如果沒有,則須手動爲此用戶授此權限。 
  
4.運行下列命令。這將重新建立OWA公共同義詞使其參照到Oracle Application Server 的OWA包。 
  create public synonym OWA_CUSTOM for OWA_CUSTOM;
  create public synonym OWA_GLOBAL for OWA_CUSTOM;
  create public synonym OWA for OWA;
  create public synonym HTF for HTF;
  create public synonym HTP for HTP;
  create public synonym OWA_COOKIE for OWA_COOKIE;
  create public synonym OWA_IMAGE for OWA_IMAGE;
  create public synonym OWA_OPT_LOCK for OWA_OPT_LOCK;
  create public synonym OWA_PATTERN for OWA_PATTERN;
  create public synonym OWA_SEC for OWA_SEC;
  create public synonym OWA_TEXT for OWA_TEXT;
  create public synonym OWA_UTIL for OWA_UTIL;
  create public synonym OWA_INIT for OWA_CUSTOM;
  create public synonym OWA_CACHE for OWA_CACHE;
  create public synonym WPG_DOCLOAD for WPG_DOCLOAD;
查看同義詞的名稱
SQL>select * from user_synonyms;
六、MATERIALIZED VIEW
6.1實體化視圖概述
Oracle的實體化視圖提供了強大的功能,可以用在不同的環境中。在不同的環境中,實體化視圖的作用也不相同。數據倉庫中的實體化視圖主要用於預先計算並保存表連接或聚集等耗時較多的操作的結果,這樣,在執行查詢時,就可以避免進行這些耗時的操作,而從快速的得到結果。在數據倉庫中,還經常使用查詢重寫(query rewrite)機制,這樣不需要修改原有的查詢語句,Oracle會自動選擇合適的實體化視圖進行查詢,完全對應用透明。實體化視圖和表一樣可以直接進行查詢。實體化視圖可以基於分區表,實體化視圖本身也可以分區。除了在數據倉庫中使用,實體化視圖還用於複製、移動計算等方面。實體化視圖有很多方面和索引很相似:使用實體化視圖的目的是爲了提高查詢性能;實體化視圖對應用透明,增加和刪除實體化視圖不會影響應用程序中SQL語句的正確性和有效性;實體化視圖需要佔用存儲空間;當基表發生變化時,實體化視圖也應當刷新。
6.2創建實體化視圖主要選項說明
創建實體化視圖時可以指定多種選項,下面對幾種主要的選項進行簡單說明:

名稱
ON PREBUILD TABLE
描述
將已經存在的表註冊爲實體化視圖。同時還必須提供描述創建該表的查詢的 SELECT 子句。可能無法始終保證查詢的精度與表的精度匹配。爲了克服此問題,應該在規範中包含 WITH REDUCED PRECISION 子句。
 

名稱
Build Clause
創建方式
描述
包括BUILD IMMEDIATE和BUILD DEFERRED兩種
取值
BUILD IMMEDIATE
在創建實體化視圖的時候就生成數據
BUILD DEFERRED
在創建時不生成數據,以後根據需要在生成數據
默認
BUILD IMMEDIATE
 

名稱
Refresh
刷新子句
描述
當基表發生了DML操作後,實體化視圖何時採用哪種方式和基表進行同步
語法
[refresh [fast | complete | force]
         [on demand | commit]
         [start with date]
         [next date]
         [with {primary key | rowid}]
]
取值
FAST
採用增量刷新,只刷新自上次刷新以後進行的修改
COMPLETE
對整個實體化視圖進行完全的刷新
FORCE(默認)
Oracle在刷新時會去判斷是否可以進行快速刷新,如果可以則採用Fast方式,否則採用Complete的方式,Force選項是默認選項
 
ON DEMAND(默認)
實體化視圖在用戶需要的時候進行刷新,可以手工通過DBMS_MVIEW.REFRESH等方法來進行刷新,也可以通過JOB定時進行刷新
ON COMMIT
實體化視圖在對基表的DML操作提交的同時進行刷新
 
START WITH
第一次刷新時間
 
NEXT
刷新時間間隔
 
WITH PRIMARY KEY(默認)
生成主鍵實體化視圖,也就是說實體化視圖是基於表的主鍵,而不是ROWID(對應於ROWID子句)。 爲了生成PRIMARY KEY子句,應該在表上定義主鍵,否則應該用基於ROWID的實體化視圖。主鍵實體化視圖允許識別實體化視圖表而不影響實體化視圖增量刷新的可用性
WITH ROWID
只有一個單一的主表,不能包括下面任何一項:
●Distinct
●聚合函數
●Group by
●子查詢
●連接
●SET操作
 
 
 

名稱
Query Rewrite
查詢重寫
描述
包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE兩種。分別指出創建的實體化視圖是否支持查詢重寫。查詢重寫是指當對實體化視圖的基表進行查詢時,Oracle會自動判斷能否通過查詢實體化視圖來得到結果,如果可以,則避免了聚集或連接操作,而直接從已經計算好的實體化視圖中讀取數據
取值
ENABLE QUERY REWRITE
支持查詢重寫
DISABLE QUERY REWRITE
不支持查詢重寫
默認
DISABLE QUERY REWRITE
6.3創建實體化視圖日誌主要選項說明
如果需要進行快速刷新,則需要建立實體化視圖日誌。實體化視圖日誌根據不同實體化視圖的快速刷新的需要,可以建立爲ROWID或PRIMARY KEY類型的。還可以選擇是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。

名稱
WITH Clause
描述
 
取值
OBJECT ID
如果是對象實體化視圖(object materialized view),則只能採用該方式
PRIMARY KEY
 
ROWID
 
SEQUENCE
 
默認
 
6.4實體化視圖
創建實體化視圖時應先創建存儲的日誌空間
  1. create materialized view log on table1   
  2.   tablespace ts_data --日誌保存在特定的表空間
  3.   with rowid;   
然後創建實體化視圖
  1. create materialized view mv_table1        
  2.       on prebuild table --將實體化視圖建立在一個已經存在的表上  
  3.       tablespace ts_data --保存表空間
  4.       build deferred --延遲刷新不立即刷新 
  5.        refresh force --如果可以快速刷新則進行快速刷新,否則完全刷新 
  6.       on demand --按照指定方式刷新  
  7.       as select * from table1;  
刪除實體化視圖日誌
  1. drop materialized view log on table1;   
刪除實體化視圖
  1. drop materialized view mv_table1;   
手工強行解除註冊。

SQL>exec DBMS_SNAPSHOT.PURGE_SNAPSHOT_FROM_LOG (snapshot_id);
 
查詢物化視圖刷新時間

SELECT MM.mview_name,MM.last_refresh_date FROM DBA_MVIEWS MM
 
ALTER MATERIALIZED VIEW user_order_mavi
   DISABLE QUERY REWRITE
   REFRESH ON DEMAND; Error! No table of contents entries found.
相關的信息可以看:  

 EXECUTE DBMS_MVIEW.EXPLAIN_MVIEW ('v_test);
select CAPABILITY_NAME, POSSIBLE,MSGTXT from MV_CAPABILITIES_TABLE;
舉例2
1)實體化視圖所依據的所有表必須註冊。如:

create materialized view log on department
                with primary key ,
                rowid (dept_name)
                including new values ;
 create materialized view log on newhire
                with primary key ,
                rowid(dept_id, salary)
                including new values ;
2)創建實體化視圖本身。如:

create materialized view dept_salary_mvw
                refresh fast on commit
                enable query rewrite
                as select d.dept_name , sum(n.salary) as num_salary
                          from department d , newhire n
                          where d.dept_id = n.dept_id
                          group by d.dept_name ;
6.5視圖的刷新

SQL>exec dbms_mview.refresh('mv_gswx');
 
SQL>select v.MVIEW_NAME,v.REFRESH_METHOD, v.LAST_REFRESH_TYPE from user_mviews v;
6.6 mv的數目與屬性查詢

SQL>select t.log_owner,t.master,t.log_table,t.current_snapshots,
    r.owner,r.name,r.snapshot_site
    from dba_snapshot_logs t,dba_registered_snapshots r
       where t.snapshot_id= r.snapshot_id(+);
6.7 mvlog查詢:MLOG$

 Select count(1) fromlog_table;
七、Oracle幾點精髓
7.1、用戶
查看當前用戶的缺省表空間

 SQL>select username,default_tablespace from user_users;
查看當前用戶的角色

 SQL>select * from user_role_privs;
查看當前用戶的系統權限和表級權限

SQL>select * from user_sys_privs;
SQL>select * from user_tab_privs;
 
SHP81:
SQL> select * from dba_role_privs  where grantee in ('PCOTBG1','OPS$PCOTRPR1') order by grantee
 
SHPU89:
SQL> select * from dba_role_privs where grantee in ('RCOTRPR1','RCOTBG1') order by GRANTEE;
 
 
 
7.2、表
刪除表中一個字段:
alter table bill_monthfee_zero set unused column date_type;
 
添加一個字段:
alter table bill_monthfee_zero add date_type number(1);
 
查看用戶下所有的表
 

 SQL>select * from user_tables; //顯示用戶表
    select * from user_views;//顯示用戶視圖
    select * from tab;顯示錶和視圖
 
查看錶的結構
 

 SQL>describe tablename;
 
查看名稱包含log字符的表
 

 SQL>select object_name,object_id from user_objects
    where instr(object_name,'LOG')>0;
 
查看某表的創建時間
 

 SQL>select object_name,created from user_objects where object_name=upper('&table_name');
 
查看某表的大小
 

 SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
    where segment_name=upper('&table_name');
 
查看放在ORACLE的內存區裏的表
 

 SQL>select table_name,cache from user_tables where instr(cache,'Y')>0;
 
SELECT FOR UPDATE
select for update語句用於鎖定行阻止其他用戶在該行上修改數據。當該行被鎖定後其他用戶可以用SELECT語句查詢該行的數據但不能修改或鎖定該行。
表字段的信息查詢sql
 

 SQL>select i.index_name, i.uniqueness, c.column_name, c.COLUMN_POSITION
     from dba_indexes i, dba_ind_columns c
     where i.index_name = c.index_name
     and i.table_name = 'COTS_TAB_ACCT_MVMT'
 
查看某表的約束條件
 

 SQL>select constraint_name, constraint_type,search_condition, r_constraint_name
       from user_constraints where table_name = upper('&table_name');

SQL>select c.constraint_name,c.constraint_type,cc.column_name
       from user_constraints c,user_cons_columns cc
       where c.owner = upper('&table_owner') and c.table_name = upper('&table_name')
       and c.owner = cc.owner and c.constraint_name = cc.constraint_name
       order by cc.position;
 
鎖定表
LOCK語句常常用於鎖定整個表。當表被鎖定後,大多數DML語言不能在該表上使用。LOCK語法如下:
LOCK schema table IN lock_mode
其中lock_mode有兩個選項:
    share 共享方式; exclusive 唯一方式
例:
LOCK TABLE intentory IN EXCLUSIVE MODE
7.3、索引
(1)95/5規則
     如果查詢的結果返回的行數少於表中所有行的5%,索引是檢索數據的最快方法。
(2)位圖索引
     如果數據集中不同的行之間只有很小的差異,適合使用位圖索引。如
     create bitmap index bi_pet_sex_flag_mf on pets(pet_sex_flag_mf);
查看索引個數和類別
SQL>select index_name,index_type,table_name from user_indexes order by table_name;

查看索引被索引的字段
SQL>select * from user_ind_columns where index_name=upper('&index_name');

查看索引的大小
SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
       where segment_name=upper('&index_name');
7.4.異常處理
    (1)exception中可以使用的全局變量
         sysdate : 系統時間
         rownum : 行號
         sqlcode : Oracle錯誤序號
         sqlerrm :Oracle錯誤消息
    (2)異常處理形式:
         ...
         Begin
         ...
         Exception
           When 異常名1 then ...
           When 異常名2 then ...
           When others then ...
         End;
4. 遊標
    (1)申明
         declare區域中申明。如
         declare
           cursor get_student_data is
                  select name , age from student ;
         begin
           ...
         end ;
   (2)使用
         兩種方式。
         a) 單行方式只能使用一行而且麻煩。如
         open get_student_data ;
         fetch get_student_data into v_name , v_age ;
         ...
         close get_student_data ;
         b) 循環方式可處理多行簡單。如
         for c1_rec in get_student_data
             loop
               ...使用c1_rec.namec1_rec.age(c1_rc不用事先定義)...
             end loop ;
5. minusintersect
    union一樣他們作用於兩個結果集之間。
    minus : 集合的差。
    intersect : 集合的交。
    必須:兩個結果集的類型一樣。
6. truncate、delete與drop
    (1)語法
         truncate table tableName ;
         delete from tableName [ where ... ] ;
         drop table tableName ;
    (2)區別
         truncate和delete是刪除表數據,drop是刪除整個表(包括結構和數據)。
         delete是dml,這個操作會放到rollback segement中,事務提交之後才生效;如果有相應的trigger,執行的時候將被觸發。
         truncate、drop是ddl,操作立即生效,原數據不放到rollback segment中,不能回滾;操作不觸發trigger。
        truncate不能授予任何人清空他人的表的權限,不能清空父表
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章