序列 Oracle 12C 之後,Oracle 之中提供的是一種手工的自動增長列控制,而這樣的控制在 Oracle 之中使用序列(對象)完成。 序列的創建: 可是該如何實現行的自動編號呢? 迴圈序列: 1、3、5、7、9 五個數據之間迴圈顯示 DROP SEQUENCE myseq ; CREATE ...
序列
Oracle 12C 之後,Oracle 之中提供的是一種手工的自動增長列控制,
而這樣的控制在 Oracle 之中使用序列(對象)完成。
序列的創建:
CREATE SEQUENCE 序列名稱 [INCREMENT BY 步長] [START WITH 開始值] [MAXVALUE 最大值 | NOMAXVALUE] [MINVALUE 最小值 | NOMINVALUE] [CYCLE | NOCYCLE] [CACHE 緩存大小 | NOCACHE]
在此數據字典之中主要包含如下列的數據信息: · SEQUENCE_NAME:表示的序列名稱; · MIN_VALUE:表示序列的最小值,預設的序列最小值是 1; · MAX_VALUE:表示序列的最大值,預設序列是沒有最大值,1028已經很大了。 · INCREMENT_BY:步長,每次增長的數據,預設的是 1; · CYCLE:是否為迴圈序列,如果是 N 表示非迴圈,如果是 Y 表示迴圈; · ORDER:表示序列是否排序; · CACHE_SIZE:序列的緩存數據; · LAST_NUMBER:序列最後一次的增長值(緩存中最大的值)。
當一個序列對象已經創建完成之後,可以採用如下的兩個偽列來進行序列的控制:
· 取得序列下一個增長數據(每次調用序列值都增長指定的步長):序列.nextval;
· 取得序列的當前數據(每次調用序列都不增長):序列.currval;
· 在使用 currval 之前一定要首先使用 nextval,否則會出現“ORA-08002: 序列 MYSEQ.CURRVAL 尚未在此
會話中定義”。
可是該如何實現行的自動編號呢?
DROP TABLE mytab PURGE ; CREATE TABLE mytab( mid NUMBER , title VARCHAR2(50) , CONSTRAINT pk_mid PRIMARY KEY(mid) ) ; INSERT INTO mytab(mid,title) VALUES (myseq.nextval,'JAVA') ;
迴圈序列:
1、3、5、7、9 五個數據之間迴圈顯示
- 序列的最大值是 9;
- 序列的最小值是 1;
- 步長應該為2;
DROP SEQUENCE myseq ; CREATE SEQUENCE myseq INCREMENT BY 2 START WITH 1 MAXVALUE 9 MINVALUE 1 CYCLE NOCACHE;
oracle 12c新特性
CREATE TABLE test1 ( id int GENERATED ALWAYS AS IDENTITY );
自增列會自動加上 not null 約束。
新增時不能向自增列插入值。
視圖
視圖就是包裝了一條複雜的 SQL 語句。
創建視圖:
CREATE [OR REPLACE] VIEW 視圖名稱 AS 子查詢 [WITH CHECK OPTIONI] [WITH READ ONLY] ;
註意:從 Oracle 10g R2 版本之後出現了一個創建視圖的許可權問題,在這之前,scott 用戶本身是具備有創建視圖許可權的, 但是之後就沒有了,那麼下麵首先執行如下的語句,來實現許可權的分配:GRANT CREATE VIEW TO scott ;
查看所有視圖對象。 SELECT * FROM user_views ;
當使用“CREATE OR REPLACE”創建視圖的時候表示的是如果視圖不存在則創建一個新的視圖,如果視圖存在
則直接使用新的子查詢,替換掉舊的子查詢。
實際工作之中,一定要本著一個原則:“視圖只能夠用於查詢,而不要用於任何更新”。
1、 避免視圖創建條件更新:WITH CHECK OPTION
2、 設置只讀視圖:WITH READ ONLY
索引
Oracle 的索引相當複雜,有幾十種索引。索引的主要功能是進行數據查詢優化的,提升資料庫操作性能的。
為了更好的觀察出性能問題,那麼下麵首先針對於一些查詢做一個分析。 範例:查詢所有工資高於 3000 的雇員工資 SELECT * FROM emp WHERE sal>3000 ; 但是現在這個代碼嚴格來講性能是很差的,如果要想觀察出性能(提示信息)問題,那麼需要打開查詢分析器。 CONN sys/change_on_install AS SYSDBA ; SET AUTOTRACE ON ; SELECT * FROM myemp WHERE sal>3000 ; 此時為了觀察出問題只能夠在 sys 用戶下觀察查詢的情況,可以發現此時的查詢採用的是“TABLE ACCESS FULL” (全表掃描,逐行掃描)。那麼這樣的查詢有可能出現這樣一個問題。 假設現在 emp 表之中存在有 50W 條記錄,而在第 20W 條記錄之後就不會再有滿足條件的數據了(sal>3000),但是 如果是全表掃描,意味著,要繼續查詢後面的 30W 行記錄,而且都是逐行掃描(逐行判斷),那麼性能一定不能高。 此時,如果要想解決此問題,那麼唯一的途徑就是數據排序,按照工資排序,但是這個時候的排序不是簡單的由高 到低的排序。那麼現在唯一的方式是按照“樹”的形式保存排序數據。 現在假設數據表之中所包含的數據順序如下:“1500、1250、2850、3000、2450、2975、1100、950、800、1600、5000”。 數據檢索的時候一定是查詢工資數據,而後由工資數據找到對應的數據記錄
那麼此時如果存在了這樣樹的結構,在進行數據查詢的時候就不再需要進行全表掃描的操作了,
只需要查詢部分數據即可,而這樣的操作就可以稱為索引
在 Oracle 資料庫裡面如果要想創建索引有兩種方式:
- 當一個列上設置了主鍵約束或者是唯一約束的時候會自動的創建索引;
- 用戶可以自己通過語法在指定的列上創建索引。
CREATE INDEX emp_sal_ind ON emp(sal)
此時索引創建完成。隨後再次進行 sal 查詢的時候顯示的不再是全表掃描,而是根據一個基數掃描。那麼通過索引的
查詢可以明顯的提升查詢性能,而索引實現的關鍵是這棵樹的維護(樹是由 Oracle 內部自行維護的)。
那麼繼續以本程式為例,如果說此時修改了某些雇員的工資呢?那麼這棵樹一定要發生變化,所有的數據都需要重新排列。
那麼此時配置的索引不僅沒有提升性能,反而降低了性能,所以索引是一種相對的手段,而且永恆都要記住,沒有絕對的性能提升途徑。
同義詞
果要想創建屬於自己的同義詞,則必須由管理員完成,而創建的語法如下: CREATE [PUBLIC] SYNONYM 同義詞的名稱 FOR 用戶名.表名稱; 範例:將 scott.emp 表定義一個 myemp 的同義詞(由 sys 完成) CONN sys/change_on_install AS SYSDBA ; CREATE SYNONYM myemp FOR scott.emp ; 創建完同義詞之後,下麵就可以直接通過 myemp 來訪問 scott.emp 數據表了。 SELECT * FROM myemp ; 那麼現在創建的同義詞 myemp 存在一個小問題。因為此時的同義詞只能夠在 sys 下使用,它並不是一個公共的同義 詞,所以要想讓所有用戶都訪問,則必須創建公共同義詞。 範例:修改同義詞的創建 CONN sys/change_on_install AS SYSDBA ; DROP SYNONYM myemp ; CREATE PUBLIC SYNONYM myemp FOR scott.emp ; 在實際的工作之中,同義詞本身只屬於 Oracle 自己的概念定義,所以此處只需要瞭解下基本概念即可。