oracle 常用知識點整理


 轉 :  oracle 常用知識點

原文鏈接:http://blog.csdn.net/weijiaxiaobao/article/details/51323573

 

Oracle 是一個龐大的系統,里面的知識點很多,在學習的時候,看到一些知識點,就貼了下來,盡不知中貼了這么多,就先做個小結吧。 里面有的知識點已經單獨拿出來寫成單篇的blog(http://blog.csdn.net/tianlesoftware)了。有的還沒有進行整理。 好記性不如爛筆頭,不過我用的不是筆。 ^_^  ...  

這里面大部分內容都是我泡CSDN 論壇的時候整理的,現在要忙其他的事,就很少去了。 泡論壇的那段時間,是我進步最快的時間,所以如果想在Oracle 上有所發展的朋友,建議也可以去論壇泡泡。 看到自己會的知識點,就幫別人解答,不會的就自己研究學習,一段時間下來,會有很大的進步。而且還能認識很多朋友。 實在是一舉兩得的事。 

 

1. 每天的8:00到23:00每隔5分鍾執行一個sql語句的JOB

--建立一個存儲過程

CREATE OR REPLACE PROCEDURE p_jobtest IS 

  v_hh VARCHAR2(2);

BEGIN

  v_hh := to_char(SYSDATE, 'hh24');

  IF v_hh >= '08' AND v_hh <= '22' THEN

    --你的sql語句

    NULL;

  END IF;

END;

/

--提交一個JOB

DECLARE

  v_jobno NUMBER;

BEGIN

  dbms_job.submit(v_jobno,

                  'p_jobtest;',

                  trunc(SYSDATE, 'mi') + 1 / 1440,

                  'trunc(SYSDATE, ''mi'') + 5 / 1440');

END;

/

2.  RMAN 中的list 命令顯示的信息是從控制文件里獲取的,如果使用rm等命令手工的刪除備份文件,這個動作不會同步到控制文件,造成不一致,這種不一致會導致使用rman時報錯。可以使用delete 刪除這些過期的記錄,在用就不會報錯了。 

RMAN>crosscheck copy; 

RMAN>list copy; 

RMAN>delete expired copy; 

3. 觸發LGWR進程的條件有: 

  1. 用戶提交 

  2. 有1/3重做日志緩沖區未被寫入磁盤 

  3. 有大於1M的重做日志緩沖區未被寫入磁盤 

  4. 3秒超時 

  5. DBWR 需要寫入的數據的SCN大於LGWR記錄的SCN,DBWR 觸發LGWR寫入。

4. 觸發DBWR進程的條件有: 

1.  DBWR超時,大約3秒 

2. 系統中沒有多余的空緩沖區來存放數據 

3.  CKPT 進程觸發DBWR

5. 每隔3秒鍾ckpt會去更新控制文件和數據文件,記錄checkpoint執行的情況。

  當發生checkpoint時,會把SCN寫到四個地方去。

  三個地方於control file內,一個在datafile header。

6. 觸發CheckPoint(檢查點) 條件有很多,比如:

1. 通過正常事務處理或者立即選項關閉例程時(shutdown immediate或者Shutdown normal), 

2. 當通過設置初始化參數:

LOG_CHECKPOINT_INTERVAL,

LOG_CHECKPOINT_TIMEOUT ,

FAST_START_IO_TARGET 強制時;

3. 當數據庫管理員手動請求時:

ALter system checkpoint;

alter tablespace ... offline;

4. 每次日志切換時;

alter system switch logfile

注意:

1. alter system switch logfile也將觸發完全檢查點的發生。

2. alter database datafile ... offline 不會觸發檢查點進程。

7. RECOVER DATABASE UNTIL CANCEL  和 RECOVER DATABASE UNTIL CANCEL USING BACKUP CONTROLFILE; 區別

1) RECOVER DATABASE UNTIL CANCEL ==> OPEN DATABASE RESETLOG

==> DATAFILE HEADER SCN一定會小於CONTROLFILE的DATAFILE SCN

如果你有進行RESTORE DATAFILE,則該RESTORE的DATAFILE HEADER SCN一定會小於目前CONTROLFILE的DATAFILE SCN,此時會無法開啟數據庫,必須進行media recovery。 重做archive log直到該datafile header的SCN=current scn

8.  建表前判斷表是否存在的存儲過程。

      

在Oracle 中沒有drop table... if exists語法。 所以我們可以在創建表之前用如下存儲過程來判斷。 

     create or replace procedure proc_dropifexists(

        p_table in varchar2 

     ) is

    v_count number(10);

begin

   select count(*)

   into v_count

   from user_objects

   where object_name = upper(p_table);

   if v_count > 0 then

      execute immediate 'drop table ' || p_table ||' purge';

   end if;

end;

 9. 表屬性中pctused,和 pctfree 作用

表示數據塊什么時候移入和移出freelist。

pctused:如果數據塊的使用率小於pctused的值,則該數據塊重新加入到fresslist中。

pctfree:如果數據塊的使用率高於pctfree的值,則該數據塊從freelist中移出。

10. oracle表空間大小沒有限制,根存儲空間而定。 

oracle9i或以下,單個數據文件最大32G(對於8K的數據塊),整個數據庫最多有64K個數據文件.單個表空間的數據文件數量沒有具體的限制,也應該是在64K以下. oracle10g以上,引入了bigfile tablespace,bigfile tablespace只有一個數據文件,最大為4G*8k=32T database file size: Operating system dependent. Limited by maximum operating system file size; typically 222(2的22次方) or 4M blocks 

11. Oracle利用現有的表創建一張新表,只要表結構相同
   create table david as select * from all_users where 1<>1;

12. 循環插入數據
declare i integer;
     begin
         for i in 1..100000 loop
         insert into test values(i);
    end loop;
    commit;
  end;

13. 開發人員通常習慣賦予所有用戶DBA權限,查看權限
  Select * From User_Role_Privs
  Select * From User_Sys_Privs

14. 看數據文件大小,單位是M
select  round(bytes/(1024*1024),0) total_space from dba_data_files
select  sum(bytes/(1024*1024)) total_space  from dba_data_files

15 控制文件大小
select  sum( block_size*file_size_blks )/1024/1024  from v$controlfile

16. 建立表空間
CREATE TABLESPACE data01
DATAFILE '/oracle/oradata/db/DATA01.dbf' SIZE 500M
UNIFORM SIZE 128k; #指定區尺寸為128k,如不指定,區尺寸默認為64k刪除表空間
DROP TABLESPACE data01 INCLUDING CONTENTS AND DATAFILES;
修改表空間大小
alter database datafile '/path/NADDate05.dbf' resize 100M

查看表空間:

select tablespace_name, file_name, sum(bytes)/1024/1024 table_size from dba_data_files group by tablespace_name,file_name;

17. 有沒有被lock,可以通過這2張dynamic view來確定:
v$locked_object,V$session

可以把該 session殺掉。
select sid,serial# from v$session where username ='XXXX'
把得到的sid,serial#號替換到下面的語句中:
alter  system  kill  session  'SID,SERIAL#'

18.  PL/SQL oracle 查詢前10條信息
SELECT * FROM table WHERE ROWNUM < 11
select * from ( select * from table order by  desc) where rownum <=5
== select top 5 * from table;

19. 查看表上是否存在的索引
        select   *   from   user_indexes   where   table_name   =   'yourtablename'
        create index IX_Tablename_column on tablename(column)

20.  select id, id2, round((id/id2)*100,2) || '%' percent from test;

21.   查詢表的行數
    select count(*) from table_name;  全表掃描 ,會自已找表有索引列並且該列為非空的(因為只有非空才能確保記錄數是全的),走INDEX_FFS.
    select count(1) from table_name; 不走索引,效率要高,但在表中有非空索引時也是走 INDEX_FFS 的

22. 用function來查看當前session的trace文件的文件名
如下
create or replace function gettracename  return varchar2 is
  v_result varchar2(200);
begin
  SELECT    d.VALUE
      || '/'
      || LOWER (RTRIM (i.INSTANCE, CHR (0)))
      || '_ora_'
      || p.spid
      || '.trc' into v_result
  FROM (SELECT p.spid
          FROM v$mystat m, v$session s, v$process p
        WHERE m.statistic# = 1 AND s.SID = m.SID AND p.addr = s.paddr) p,
      (SELECT t.INSTANCE
          FROM v$thread t, v$parameter v
        WHERE v.NAME = 'thread'
          AND (v.VALUE = 0 OR t.thread# = TO_NUMBER (v.VALUE))) i,
      (SELECT VALUE
          FROM v$parameter
        WHERE NAME = 'user_dump_dest') d;
        
  return v_result;
end gettracename;

運行SQL> select gettracename() from dual;即可
GETTRACENAME()
-----------------------------------------------------------------------

F:/DEVELOPER/ORACLE/PRODUCT/10.2.0/ADMIN/ORCL/UDUMP/orcl_ora_3800.trc


23 . select case when(a>b) then a else b end from TableA;
    select greatest(a,b) from tb

24.  TRUNCATE TABLE  Table_name
使用truncate時,速度比delete,但是系統不做Log。清空表的數據,僅保留類別結構,被刪除的數據不能ROLLBACK,這點是與DELETE的主要差別.不能Rollback也就是會刪除log文件.在SQL Server里面如果你用Truncate,自動增長的行又會從1開始

25.  select substrb('大小abc',1,6) from dual;


26. 表中的數據如下圖所示
a                      b                c
1           PP41982             SO90029
2           PP41982            SO90029
只取出字段b,c不重復的字段,

select b,c from t group by b,c having(count(b) <2)

27. 查詢鎖的情況
  1). insert into test values(1);
  2). select userenv('sid') from dual;
  3). select * from v$lock where sid=''
sid 在v$session 中有這個列,可以結合v$session 查詢更多的信息

28.  刪除重復行:
SQL> DELETE FROM a WHERE ROWID IN( SELECT MAX(ROWID) FROM a);
已刪除 1 行。
SQL> select * from a;
NAME                         ID ORDER_TITLE
-------------------- ---------- --------------------
中國科學技術大學              1 科學
中國科學技術大學              1 科學
SQL>

29. 查看索引信息

--查看索引名稱
SELECT * FROM USER_INDEXES;
-- 查看索引列名
SELECT * FROM DBA_IND_COLUMNS;
SELECT * FROM USER_IND_COLUMNS;
SELECT * FROM ALL_IND_COLUMNS;

30. oracle trunc()函數用法


1.TRUNC(for dates)
TRUNC函數為指定元素而截去的日期值。
其具體的語法格式如下:
TRUNC(date[,fmt])
其中:
date 一個日期值
fmt 日期格式,該日期將由指定的元素格式所截去。忽略它則由最近的日期截去
下面是該函數的使用情況:
TRUNC(TO_DATE(’24-Nov-1999 08:00 pm’,’dd-mon-yyyy hh:mi am’))
=’24-Nov-1999 12:00:00 am’
TRUNC(TO_DATE(’24-Nov-1999 08:37 pm’,’dd-mon-yyyy hh:mi am’,’hh’)) =’24-Nov-1999 08:00:00 am’

2.TRUNC(for number)
TRUNC函數返回處理后的數值,其工作機制與ROUND函數極為類似,只是該函數不對指定小數前或后的部分做相應舍入選擇處理,而統統截去。
其具體的語法格式如下
TRUNC(number[,decimals])
其中:
number 待做截取處理的數值
decimals 指明需保留小數點后面的位數。可選項,忽略它則截去所有的小數部分
下面是該函數的使用情況:
TRUNC(89.985,2)=89.98
TRUNC(89.985)=89
TRUNC(89.985,-1)=80
注意:第二個參數可以為負數,表示為小數點左邊指定位數后面的部分截去,即均以0記。

31. local是局部有序,整體無序,global是有序的,所以local可能會比global慢,得看你的sql語句怎么寫的,需求是什么樣的
global索引->自己想怎么玩就怎么玩
local索引->表怎么玩它就怎么玩

32, 查看磁盤物理讀寫情況:
SELECT NAME,phyrds, phywrts,readtim,writetim FROM v$filestat a, v$datafile b WHERE a.FILE#=b.FILE#
ORDER BY readtim DESC; 

33. 從表中篩選出所有能被5整除的value值數據
 
select * from table where mod(datavalue,5) = 0; 

34. Union與Union All的區別
如果我們需要將兩個select語句的結果作為一個整體顯示出來,我們就需要用到union或者union all關鍵字。union(或稱為聯合)的作用是將多個結果合並在一起顯示出來。
union和union all的區別是,union會自動壓縮多個結果集合中的重復結果,而union all則將所有的結果全部顯示出來,不管是不是重復。
  Union:對兩個結果集進行並集操作,不包括重復行,同時進行默認規則的排序;
  Union All:對兩個結果集進行並集操作,包括重復行,不進行排序;

select empno,ename from emp
union
select deptno,dname from dept

我們沒有必要在每一個select結果集中使用order by子句來進行排序,我們可以在最后使用一條order by來對整個結果進行排序。例如:
select empno,ename from emp
union
select deptno,dname from dept
order by ename;

35. 查看看到A用戶下的所有數據量>100萬的表的信息
  select * from user_all_tables a
  where a.num_rows>1000000
 
前提是a用戶下所有表的統計信息都是最新的。
保險的辦法是所有表都count一遍:
select 'select '||''''||table_name ||''','||'count(*) from '||table_name from user_all_tables ;
把上面這段sql的執行結果拷貝出來執行即可 

36.  SQLPLUS 里執行 EXPLAIN PLAN
 
SQL>EXPLAIN PLAN FOR 你的sql語句;

SQL>EXPLAIN PLAN FOR SELECT * FROM EMP WHERE EMPNO=7369;
然后
SELECT plan_table_output
  FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));
查看結果就是前面SQL語句的執行計划。 

37. nvarchar2(2000)  不區別漢字和字母
   varchar2(4000)  只能存儲2000 個漢字
 
  nvarchar2最大2000
  varchar2 最大4000

38. 更新表被鎖,KILL spid后,select * from tabname for update 獨占資源。
      v$locked_object  dba_objects 聯合可以知道鎖表的session 

39.  PGA中sort_area_size大小不夠時,用到臨時表空間。

40.  oracle沒有標識列,自動增長的這個概念

 需要用序列來實現
 CREATE SEQUENCE sid
 INCREMENT BY 1 
START WITH 1 
MAXVALUE 99999999 

select sid.nextval, --取下一個序列
      sid.currval --取當前序列
from dual;

41.  IMP/EXP 的buffer達到1M以后,性能的提升並不大,5M或者10M的足夠用

42. 如果null參與聚集運算,則除count(*)之外其它聚集函數都忽略null.
 如:
     ID    DD
     1      e
     2    null
     select  count(*) from table  --結果是2
     select  count(DD)  from table  ---結果是1

count(1)和count(主鍵) 這兩個只掃描主鍵Index就可以得到數據,
 count(*)是掃描表的。
 所以count(1)和count(主鍵)這兩個效率高。
 還有一種寫法是count(ROWID)這也是只掃描Index的,效率高。

43.  Linux 掛在windows 共享的盤
 
1. 啟動nfs服務:   service nfs start
2.mount -o username=user,password=123456 //10.85.2.194/share /mnt

44. Kill session 並使狀態直接變成killed

EXECUTE IMMEDIATE ''ALTER SYSTEM KILL SESSION '''':sid,:serial#'''' IMMEDIATE''
EXECUTE IMMEDIATE ''ALTER SYSTEM KILL SESSION '''':sid,:serial#''''

immediate是立即kill,不會有status 會變成killed狀態的,清楚了在v$session里的信息 

45. truncate 只是刪除了表中的記錄,並不會改變表的結構及依賴約束,所以truncate表后表的索引依然存在,但是表和索引所占用的空間會恢復到初始大小

46. 這是看高速緩存命中率小於80%的SQL
SELECT EXECUTIONS , DISK_READS, BUFFER_GETS,
  round((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,
   ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,
   SQL_TEXT
  FROM V$SQLAREA
  WHERE EXECUTIONS>0
  AND BUFFER_GETS > 0
  AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8
  ORDER BY 2 desc,4 DESC; 

47.  數據庫在主備庫切換之后要手動的用SQL來檢查檢查有沒有死鎖,如果有,kill 就可以了..

SQL> select 'alter system kill session '''||sid||','||serial#||''';' from v$session where sid in (select sid from v$lock where block = 1);
 'ALTER SYSTEM KILL SESSION'''||SID||','||SERIAL#||''';'

48. EOF是標記控制字符開始,到結束,隨便什么字符都可以用的

sqlplus '/ as sysdba' <<eof
{
shutdown immediate;
startup force dba pfile=$ORACLE_HOME/dbs/init.ora;
shutdown immediate;
}
exit;
eof
 
49. parallel(table,4) 並行度為4
parallel(table)  如果使用parallel 但未指定並行度,則DOP要通過初始化參數CPU_count 和Parallel_THREADS_PER_CPU計算得到,

並行度為4的程序,最多可以分配或創建9個並行執行服務器來滿足這個事務操作,所以並行操作速度有很大提高,但對CPU占用比較多

並行操作增加了事務操作的性能,但會連續的記錄重做日志,並且造成瓶頸,所以可以使用nologging 模式來避免瓶頸
sql> alter  table  table_name  NOLOGGING;

50. 約束名從表user_constraints表中找
 SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME='FJ5W_FZ_JMD_S'

51. Oracle確實沒有convert函數,只有to_char() 和 to_date()...
 sql: CONVERT(VARCHAR(10),GETDATE(),111)
 oracle: to_char(sysdate,'yyyy/mm/dd')

52.  V$視圖 是由catalog.sql 腳本創建的. 所以升級系統后要執行這個腳本..

53.  用Oracle的orapwd 命令
 orapwd file=D:/PWDorcl.ora password=admin entries=5;
windows下oracle默認的位置是db_1/database目錄,默認的文件名是pwdSID.ora,對於別的文件名是不認的。linux下oracle默認的位置是$ORACLE_HOME/dbs目錄,默認的文件名是orapwSID,對於別的文件名是不認的。
其中參數entries的含義是表示口令文件中可以存放的最大用戶數,對應於允許以SYSDBA/SYSOPER權限登錄數據庫的最大用戶數,如果用戶數超過這個值只能重建口令文件,增大entries。

54. oracle表空間大小沒有限制,根存儲空間而定。
oracle9i或以下,單個數據文件最大32G(對於8K的數據塊),整個數據庫最多有64K個數據文件.單個表空間的數據文件數量沒有具體的限制,也應該是在64K以下.
oracle10g以上,引入了bigfile tablespace,bigfile tablespace只有一個數據文件,最大為4G*8k=32T
database file size:
 Operating system dependent. Limited by maximum operating system file size; typically 222(2的22次方) or 4M blocks

55. ROWNUM 是查詢時的一個記錄號,是一個偽列
 
rownum只和最終輸出結果order by之前的順序一致

select rownum,t.* from user_tables t;
 select rownum,t.* from(select * from user_tables order by table_name)t;
 select * from (select rownum,t.* from user_tables t order by table_name);

56. 你的數據庫是dedicated還是shared模式Oracle數據庫服務器,根據客戶端請求后process的調度方式,分為dedicated(專用)模式和shared(共享)模式。
專用模式意味着每個客戶端的連接后,Oracle都會分配一個新的process和自進行交互。而共享模式是,通過一個調度程序,來分配process,有可能是以前客戶端已經處理過的空閑的process,由於process的模式不是專用的,所以相對來說,節省資源。
那么我們如何來查看我們的oracle是哪種模式呢?
Window系統下,通過任務管理列表里,查看Oracle.exe進程所占用的線程數,如果沒有這個指標,可以通過view->select columns->checked Thread count.即可。
用sqlplus連接成功以后,thread count如果會增加,即為專用模式,來一個增加一個,走一個減一個。反之,共享模式。
Linux下,通過ps oracle查看oracle的進程個數。 和window的判斷方法一樣,不過命令不同而已。
我們也可以查看數據庫的parameter,如果shared_servers的數目大於0的話,即是。

57.  order by t.tm_error desc, 必須是 group by里的字符,或者是統計字段。

58. 大量更新表時:
1.關掉tableb 的所有觸發器,這個一定要關掉,moving data的時候一定要全部關掉,不然批量操作的時候卡死你Y的。
   alter system tableb disable all triggers;
   執行完畢之后,啟動觸發器
   alter system tableb enable all triggers;
2,除了主鍵索引之外,tableb表剩余的索引全部刪除掉。等執行完畢之后,重建索引(索引重建很快,我的800萬數據的表的6個索引重建才花了2分鍾而已)

59. 訪問V$FIXED_VIEW_DEFINITION 視圖可以獲取組成V$視圖的底層X$表的所有信息
 
select count(*) from v$fixed_table where name like 'V%';
select view_name from V$fixed_view_definition;
select count(*) from v$fixed_view_definition;
select view_definition from V$FIXED_VIEW_DEFINITION WHERE view_name='V$PX_SESSION';

60.  dba_views 是從Oracle底層數據庫的表中得到的,不是從X$表或者v$視圖。
 
SQL> SET LONG 2000000
SQL>select text from dba_views where viewname='DBA_IND_PARTITIONS';

61. Oracle 10.2.0.1 中有613張X$ 表,9i 有394張。 X$表包含了特定實例的各方面的信息,如當前的配置信息,連接到實例的會話,以及豐富而有價值的性能信息。 X$表並不是駐留在數據庫文件的永久表或臨時表。X$表僅僅駐留在內存中,當實例啟動時,他們就創建了,在內存中進行實時的維護。 它們中的大多數至少需要裝載或已經打開的數據庫。X$表為SYS用戶所擁有,並且是只讀的。 不能進行DML(更新,插入,刪除)。

62.  Parse CPU to Parse Elapsd %:  127.27     % Non-Parse CPU:   97.12
parse cpu = amount of cpu time used to parse
elapsed time parsing = amount of time on the wall clock spent parsing.
100*(parse time cpu / parse time elapsed)= Parse CPU to Parse Elapsd %
in a perfect world, with no contention -- parse cpu = parse elapsed.
ratio = 100%
in a bad world, it takes longer to parse (elapsed) then cpu time used
 (contention).  ratio < 100%
in your case, what this is saying is the CPU exceeded the elapsed, which
 technically is not possible -- but happens due to the way "small fast things"
 are measured on computers.  It is hard to measure things that happen very
 rapidly accurately.  So, this ratio, when > 100%, is the same as "100%" for all
 intents and purposes

63.  sqlnet.ora文件里的內容注釋掉,在重啟下lsnrctl,應該就可以:
 #SQLNET.AUTHENTICATION_SERVICES = (NTS)
Easy Connect指的是使用conn scott/tiger@hostname (or ip):port/global database name的方式連接數據庫,這種方法不需要tnsnames.ora文件的任何內容.
在sqlnet.ora中需要聲明你使用的命名方法。需要注意的是default domain,如果你聲明了,那么在tnsnames.ora中必須在net service name后面把域名附加上。這樣才能保證你在conn scott/tiger@netsvname 時候能夠成功

64. sqlnet.ora文件決定找數據庫服務器別名的方式
   默認的參數有
   NAMES.DEFAULT_DOMAIN = WORLD
   NAMES.DIRECTORY_PATH = (TNSNAMES, ONAMES, HOSTNAME)
  
    如果你的ORACLE客戶端和服務器默認的域名不一樣,需要用#號注釋第一行
   #NAMES.DEFAULT_DOMAIN = WORLD
   使它不起作用。
   NAMES.DIRECTORY_PATH指定找服務器別名的順序 (本地的tnsnames.ora文件, 命名服務器, 主機名方式)

65. 在日文操作系統下用pl sql開發
要求只能輸入半角,用Length(a),LengthB(a)可以判斷出是否是半角。
  但是還有個要求是不能輸入日本語,也就是要怎么判斷是'半角片假名'呢?
  
用TO_SINGLE_BYTE()函數轉成半角 在插入 

66.  SQL> !lsnrctl set log_status off;
! 在SQL里面表示執行非SQL的語句
如:
SQL> !fdisk -l
window下是$,linux下是!

67. 跨schema的交叉型trigger在exp/imp時會丟失,因為所依賴的基表在exp/imp時斷開了。 除非你把這些shema全都導出。

68. Number的數據聲明如下:
表示                     作用                        說明
Number(p, s)        聲明一個定點數        p(precision)為精度,s(scale)表示小數點右邊的數字個數,精度最大值為38,scale的取值范圍為-84到127
Number(p)         聲明一個整數             相當於Number(p, 0)
Number            聲明一個浮點數          其精度為38,要注意的是scale的值沒有應用,也就是說scale的指不能簡單的理解為0,或者其他的數。
 
定點數的精度(p)和刻度(s)遵循以下規則:
?        當一個數的整數部分的長度 > p-s 時,Oracle就會報錯
?        當一個數的小數部分的長度 > s 時,Oracle就會舍入。
?        當s(scale)為負數時,Oracle就對小數點左邊的s個數字進行舍入。
?        當s > p 時, p表示小數點后第s位向左最多可以有多少位數字,如果大於p則Oracle報錯,小數點后s位向右的數字被舍入

69. oracle update 多表關聯
 UPDATE a
   SET (ID, NAME) = (SELECT b.ID, b.NAME
                       FROM b
                      WHERE a.ID = b.ID)
 WHERE EXISTS (SELECT 1
                 FROM b
                WHERE a.ID = b.ID) 

70. 查看SCN:
SELECT dbms_flashback.get_system_change_number FROM dual;
SELECT CURRENT_SCN FROM V$DATABASE;

71. 注意理解系統時間標記與scn的每5分鍾匹配一次這句話,舉個例子,比如scn:339988,339989分別匹配08-05-3013:52:00和2008-13:57:00,則當你通過as of timestamp查詢08-05-30 13:52:00或08-05-30 13:56:59這段時間點內的時間時,oracle都會將其匹配為scn:339988到undo表空間中查找,也就說在這個時間內,不管你指定的時間點是什么,查詢返回的都將是08-05-30 13:52:00這個時刻的數據。

查看SCN和timestamp之間的對應關系:
select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss')from sys.smon_scn_time;

72. 當查詢的記錄的結果集大於總記錄的20%時,一定要使用全表掃描

73. 當AWR顯示,占用資源較多的SQL是類似時,這是對這些SQL就應該使用綁定變量來減少硬解析. 

74. select name,value ,ISSYS_MODIFIABLE from v$parameter
如果ISSYS_MODIFIABLE 返回的是false,說明該參數無法用alter system語句動態修改,需要重啟數據庫

75. oracle子查詢中能使用order by
from 子句后面的內聯視圖是可以使用order by子句進行排序的。
 然而,其它視圖或子查詢是不能用order by進行排序的
 如果你要用選擇前幾條的話,需要在套一層變成from后面的內聯視圖。
 比如
 select * from dept a
   2  where a.deptno in
   3  (
 select depton from (
   4  select b.deptno from dept b
   5  order by b.dname
   6  ) [where rownum < 5])

76. 修改temp表空間自動增長:
alter database tempfile 'D:/ORACLE/ORADATA/DBA/TEMP01.DBF' autoextend on next 20m;
 修改表空間自動增長:
alter database datefile 'D:/ORACLE/ORADATA/DBA/user01.DBF' autoextend on next 20m;

77. alter index rebuild與alter index rebuild online的區別
online時可以在該索引的基表上執行DML,在在對基表操作的同時可以REBUILD INDEX,但是不能執行DDL語句,所以他們的鎖機制是不樣的。
創建索引時通常會對該表設置一個表級共享(DML)鎖,如果設置ONLINE ,
如果是非ONLINE方式,通常會對該表設置一個表級共享(DML)鎖,那么就對DML語句沖突,如果設置ONLINE ,(會使用臨時日志IOT表來記錄中間改變的數據),但要使用兩倍於傳統方法的空間.表會變成行級共享鎖,在創建索引或者ALTER完成后,對臨時日志表與基表進行MERGE

注意並行處理,DDL,位圖索引不能使用ONLINE。

78. colb,字符串大對象,存的是長字符串數據
  blob,二進制大對象,存的是二進制型,比如圖像、音頻數據

79. SQLPLUS 默認不是自動提交的.
  自動提交命令:
  SQL>set autocommit on

退出SQLPLUS 時會自動提交
指定DDL,如CREATE , ALTER, DROP ,會自動提交
執行DCL,如GRANT,REVOKE,會自動提交

80. 臨時表空間不能脫機。system,和正在使用(有活動session或transaction)的也不能。

81. 查詢正在執行的sql
 select OSUSER, PROGRAM, USERNAME, SCHEMANAME, B.Cpu_Time, STATUS, B.SQL_TEXT  
  from V$SESSION A  
  LEFT JOIN V$SQL B ON A.SQL_ADDRESS = B.ADDRESS  
                  AND A.SQL_HASH_VALUE = B.HASH_VALUE  
  where b.SQL_TEXT is not null
 order by b.cpu_time desc

82. Oracle在to_char()函數在計算一年中第幾周是從該年的1月1日開始的。

83. 正在連接的用戶不能刪除,確實要刪除的話,如下
 1、select sid,serial#,username from v$session where user='USERNAME';
 2、alter system kill session 'sid,serial#';
 3、drop user username cascade;

84. 在排除索引限制的條件下,如果索引還是沒有被引用,可以檢查下參數。
optimizer_index_cost_adj為100,該參數影響優化器選擇索引還是全表掃描的傾向,將其修改為35.

85. 在Oracle中,要獲得日期中的年份,例如把sysdate中的年份取出來,並不是一件難事。
  常用的方法是:Select to_number(to_char(sysdate,''yyyy'')) from dual,
  而實際上,oracle本身有更好的方法,那就是使用Extract函數,
  使用方法是:Select Extract(year from sysdate) from dual,這種方法省掉了類型轉換,看上去更加簡潔。
  相應的,要取得月份或日,可以用select extract (month from sysdate) from dual和select extract (day from sysdate) from dual。
此方法獲得的結果,是數值型的,大家可以設置一個方法測試一下。
select EXTRACT(year FROM to_date('2009-11-10','yyyy-mm-dd')) year from dual;

86. 查詢數據庫默認的表空間類型:
 SQL> select property_name,property_value from database_properties where property_name='DEFAULT_TBS_TYPE';
 PROPERTY_NAME            PROPERTY_VALUE
 ------------------        ------------------
 DEFAULT_TBS_TYPE          BIGFILE

 87. 在10g中,有一個特性,就是bigfile tablespace,這種類型的表空間只能有一個數據文件,且該數據文件允許有4G的數據快,即如果db_block_size=8k的話,最大容量為4G*8K=32T,當然,這個還要看操作系統的限制了。

 修改數據庫默認的表空間類型為smallfile,就可以為表空間創建多個數據文件了。
 SQL> alter database set default smallfile tablespace;
 Database altered.

 也可以在創建表空間時,指定表空間類型:create smallfile/bigfile  tablespace ....

88. exp 失敗執行的腳本:

Catexp.sql :  這個腳本是用於生成exp命令執行時所需要的一些表和視圖,在執行exp命令出現找不到什么什么表,什么什么視圖時使用。
 Catmeta.sql :這個腳本是在升級后執行exp命令出現錯誤時運行,說是因為升級不成功,運行這個腳本可以重新創建系統表。

89. 日期一般就用to_date(str,format)格式轉換, 像'yyyy-mm-dd'這樣的可以直接用date'xxxx'簡化

select date'2009-11-11' as d fromdual;
select * from t where t.day=date'2009-11-11';
 
90. sqlplus命令save可以把sql語句保存到文件中,可是默認的存放路徑是$ORACLE_HOME/bin,即sqlplus可執行文件存放的位置,當然有的人說在文件名前加絕對路徑即可:save d:/oracle/admin/oradb/emp.sql
可是這種寫法未免太麻煩,特別是使用get命令,也得使用絕對路徑,因此如果能夠修改save的默認位置,那么save/get就好寫的多了。

91. 查詢某一對象的類型,比如查詢'v$datafile'是同義詞還是視圖?
select * from all_objects where object_name=upper('v$datafile')

92.  http://download.csdn.net/source/1841831
我上傳了一個包,可以獲得漢字的拼音或者首字母,oracle漢字轉拼音 

93. Index ENABLE和DISABLE適用於FUNCTION-BASED INDEX
  如果普通索引的話,你就用unusable 而不是disable
ENABLE和DISABLE只針對函數索引。

 ENABLE applies only to a function-based index that has been disabled because a user-defined function used by the index was dropped or replaced. This clause enables such an index if these conditions are true:

     * The function is currently valid
     * The signature of the current function matches the signature of the function when the index was created
     * The function is currently marked as DETERMINISTIC
 Restriction on Enabling Function-based Indexes
 You cannot specify any other clauses of ALTER INDEX in the same statement with ENABLE.

 DISABLE Clause

 DISABLE applies only to a function-based index. This clause lets you disable the use of a function-based index. You might want to do so, for example, while working on the body of the function. Afterward you can either rebuild the index or specify another ALTER INDEX statement with the ENABLE keyword.

 樓主試試:
 alter index xx unusable;

 UNUSABLE Clause Specify UNUSABLE to mark the index or index partition(s) or index subpartition(s) UNUSABLE. An unusable index must be rebuilt, or dropped and re-created, before it can be used. While one partition is marked UNUSABLE, the other partitions of the index are still valid. You can execute statements that require the index if the statements do not access the unusable partition. You can also split or rename the unusable partition before rebuilding it.

94. 如何清除inactive的session
1.方法一
(1)UNIX的方法
A。sql>select usename,sid,paddr,status
 from v$session
where usename='USERNAME'
AND STATUS='INACTIVE';
B。sql>SELECT SPID FROM V$PROCESS WHERE ADDR=上一步查出的PADDR
C。$KILL SPID

(2)WINDOWSnt/2000的方法
c:/>orakill SID SPID

2 ,方法二
select A.SID,B.SPID,A.SERIAL#,a.lockwait,A.USERNAME,A.OSUSER,a.logon_time,a.last_call_et/3600 LAST_HOUR,A.STATUS,
 'orakill '||sid||' '||spid HOST_COMMAND,
'alter system kill session '''||A.sid||','||A.SERIAL#||'''' SQL_COMMAND
from v$session A,V$PROCESS B where A.PADDR=B.ADDR AND SID>6

95. sqlnet.ora 文件中配置 sqlnet.expire_time參數,Dead Connection Detection 在服務器端使用。每當一個客戶端的連接建立時,SQL*NET讀取此參數,以決定多長時間發送包給連接的客戶端,偵測連接是否還有效,如果無效,則通知操作系統釋放該會話持有的資源。防止因網絡的異常中斷導致會話長期持有資源不釋放。設置為0應該是不啟用DCD。
如sqlnet.expire_time=10,則表示10分鍾
sqlnet.expire_time的單位為分鍾.

96. EXP/IMP 可以使用參數文件。如mypar.par,內容就是你要指定的參數,如
 owner=scott
 file=mydump.dmp
 log=mydump.log
 direct=y

 在用exp時用parfile參數指定這個文件就可以了
 exp myname/mypass@mydb parfile=mypar.par

97. 分頁一般用到兩種辦法:
 1,利用rownum
 2,分析函數row_number()over()
 1.
select from(
   select t.*,rownum rn from(
     select * from a
     order by col1)t
   where rn between 101 and 200)
 2.
   select *
   from(select t.*,row_number()over(order by col1)rn
     from t)
   where rn between 101 and 200
 
98. row_number()和ROWNUM是看起來相似但概念完全不同的東西,  
   row_number()是一個分析函數(Analytic   Function),它返回的是基於over()參數的行號。  
   rownum是oracle特別提供的一個偽列,它只作用於查詢的結果集,根據結果集輸出的先后次序給每個紀錄順次編號。  
row_number() 要比rownum 高很多. 對一大表測試時, row_number() 用時6s,rownum 用時 17s.

99. listener 主要是偵聽從客戶端發來的對數據庫的連接請求。
如果你在服務器端用sqlplus 進行連接,監聽沒有啟動也是可以連上的,但是從遠程來訪問數據庫,或者用PL/SQL dev 或者TOAD等進行連接,就必須啟動監聽。

100. 這個命令可以查看建表的SQL語句..
 select dbms_metadata.get_ddl('TABLE','&tname') from dual;
 
101. 查詢視圖可以通過
 select * from all_views
 索引:all_indexes,  索引和列的關系 all_ind_columns。table_name即索引所在的表
 如果只想查詢當前用戶下的,將上面數據字典的all改成user

102. char 最大長度是2000.
SQL> create table test (v2 char(2001));
 create table test (c char(2001))
 ERROR at line 1:
 ORA-00910: specified length too long for its datatype
SQL> create table test1 (c char(2000));
 Table created.

103. Oralce 快照是Oralce 7時候的叫法吧,8i之后改名物化視圖

104, 一個小觸發器
create table t_temp
 (
   id  varchar2(10) primary key,
   len1  number(6,0),
   len2  number(6,0),
   len number(7,0)
 )
 當update某一行的len1或len2值后,則修改該行len的值(len = len1 + len2),
 或者insert 一條新的記錄后,修改len = len1 + len2
 哪位幫我用觸發器實現上面的功能
create trigger tri
 befor insert or update on t_temp
 for each row
 begin
   :NEW.len := :NEW.len1 + :NEW.len2;
 end;

create or replace trigger tgtemp
 before insert or update of len1,len2
 on t_temp
 for each row
 begin
 :new.len:=:new.len1+:new.len2;
 end;

oracle 不允許觸發器修改它正在觸發的表,故用before 可以,after不行..

105. udump下的trc文件可以通過配置不讓產生,利用命令
alter system set sql_trace=false;
其他的不能修改,只能手動的啟動trace,手動的關閉trace.

比如:
alter session set events 'immediate trace name library_cache|controlf|systemstate|processstate|file_hdrs|REDOHDR level 10';
alter session set events 'immediate trace name off';

alter session set events '10046 trace name context forever,level 12';
alter session set events '10046 trace name context off';

alter system set events '10046 trace name context forever,level 12';
alter system set events '10046 trace name context off';

106. 重復數據只顯示一條:
select min(id) id,b,c from tb group by b,c

107. 刪除重復數據:
delete from tb where rowid not in (select min(rowid) from tb group by b,c);

108. oracle 批量重建索引
create or replace procedure p_rebuild_all_index
   (tablespace_name in varchar2)
as
   sqlt varchar(200);
begin
    for idx in (select index_name, tablespace_name, status from user_indexes where tablespace_name=tablespace_name and status='VALID' and temporary = 'N') loop
    begin
           sqlt := 'alter index ' || idx.index_name || ' rebuild ';
           dbms_output.put_line(idx.index_name);
           dbms_output.put_line(sqlt);
           EXECUTE IMMEDIATE sqlt;
           --錯誤后循環繼續執行。
           EXCEPTION
           WHEN OTHERS THEN
                dbms_output.put_line(SQLERRM);
     end;              
     end loop;
end;
oracle 存儲過程批量重建索引。
測試方法
declare
    --表空間名稱
  tablespace_name varchar2(100);
begin
  tablespace_name:='dddd';
  p_rebuild_all_index(tablespace_name);
end;

109. oracle 會將SQL語句中 in 后面的東西生成一張內存中的臨時表。然后進行查詢。所以在相關字段上見索引比較重要。

110. 在Oracle中查看各個表、表空間占用空間的大小 查看當前用戶每個表占用空間的大小:
    Select Segment_Name,Sum(bytes)/1024/1024 From User_Extents Group By Segment_Name

 查看每個表空間占用空間的大小:
    Select Tablespace_Name,Sum(bytes)/1024/1024 From Dba_Segments Group By Tablespace_Name

111. 格式化2個時間相減

SELECT      EXTRACT (DAY FROM interval)
         || '天'
         || EXTRACT (HOUR FROM interval)
         || '小時'
         || EXTRACT (MINUTE FROM interval)
         || '分鍾'
         || EXTRACT (SECOND FROM interval)
         || '秒'
            間隔
  FROM   (SELECT   NUMTODSINTERVAL (callbegin - callend, 'DAY') interval
            FROM   tbilllog12 t
           WHERE   callbegin =
                      TO_DATE ('2009-12-1 0:00:58', 'YYYY-MM-DD HH24:MI:SS'))

間隔                                                                            
-----------------------------------------------
0天0小時0分鍾-24秒                                                              
1 row selected.

112. 相關定義 

ORACLE_SID:操作系統環境變量ORACLE_SID用於和操作系統交互。也就是說,在操作系統中要想得到實例名,就必須使用ORACLE_SID,在操作系統級別唯一識別oracle instance.
 LD_LIBRARY_PATH :你的系統用到oracle共享庫存在於需要指定的路徑。
 ORACLE_TERM:是ORACLE在XWINDOW圖形界面安裝時要使用的變量,必須正確設置,否則安裝程序無法在xwindow中啟動。
 ORACLE_OWNER :對該文件具有訪問特權的用戶;通常是創建該文件的用戶。  

113. 修改系統時間格式:
alter   session   set   nls_date_format='YYYY-MM-DD'

修改默認的時間格式:
1、windows下,在注冊表中   HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE下增加一字符串:NLS_DATE_FORMAT,把其值設成:YYYY-MM-DD  
   2、Unix下,在用戶的.profile文件中增加以下內容:  
   NLS_DATE_FORMAT=YYYY-MM-DD  
   export   NLS_DATE_FORMAT

Nls_lang 是Linux 系統的環境變量;
Nls_language 是數據庫的參數。

如果數據庫字符集沒有問題,而查詢出來的卻是亂碼,可以檢查下系統的環境變量。
export NLS_LANG="simplified chinese_china.zhs16gbk"

修改系統時間格式:
SQL>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
或者在系統 export NLS_DATE_FORMAT=YYYY-MM-DD HH24:MI:SS
或者在pro_file里面 添加一個變量 nls_date_format, 這樣就不用每次都需要設置時間了。

114. ORACLE9.2.0.8 不支持,not in()中帶union的SQL.

115. recover database using backup controlfile和recover database using backup controlfile until cancel
前者是利用backup controlfile完全恢復
后者是利用backup controlfile不完全恢復。

using backup controlfile 告訴Oracle不要使用control file中的scn
using backup controlfile until cancel 用於redo log file丟失時使用,如redo log sequence#1,2,3,4,5,6,丟失4,5,會恢復到3。

兩個連用告訴Oracle恢復的時候恢復到最后一個可用的redo log file,不管控制文件中的scn是多少

116. 一般來說 ORACLE實例內存=物理內存*80%

對於OLTP系統:
PGA=實例內存*20%
SGA=實例內存*80%

對於OLAP系統:
PGA=實例內存*50%
SGA=實例內存*50%

混合型系統在二者之間

確定內存容量后,
對於PGA:使用WORKAREA_SIZE_POLICY設置為AUT,表示PGA自動管理
用PGA_AGREGGATE_TARGET參數分配PGA

用SGA_TARGET參數分配SGA目標值
用SGA_MAX_SIZE分配SGA最大值

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM