第三章索引視圖序列
序列是用來生成唯一,連續的整數的數據庫對象。序列是用來自動生成主鍵或唯一鍵的值。
CREATE SEQUENCE sequence_name
START WITH integer
INCREMENT BY integer
MAXVALUE integer|nomaxvalue
MINVALUE integer|nominvalue
CYCLE|NOCYCLE
CACHE integer|nocache;
START WITH 指要生成的第一個序列號,對於升序,其默認值為最小值。對於降序其默認值為最大值。
INCREMENT BY : 用於指定序列號之間的間隔。其默認值為1。 如果為正值,則生成的序列按升序排列,如果為負值,則生成的序列按降序排列
MAXVALUE :指定序列可生成的最大值
NOMAXVALUE :如果指定了NOMAXVALUE,Oracle將升序序列的最大值設置為10的27次方,將降序序列的的最大值設為-1.
MINVALUE : 指定序列的最小值。MINVALUE必須小於或等於START WITH 的值,並且必須小於MAXVALUE。
NOMINVALUE :如果指定了NOMINVALUE ,Oracle將升序序列的最小值設置為1,或者將降序的最小值設置為-10 的26次方。
CYCLE :指定序列在達到最大值或最小值後,將繼續從頭開始生成值
NOCYCLE :指定序列在達到最大或者最小值的時候,將不能繼續生成值
CACHE :使用CACHE選項可以預先分配一組序列號,並將其保存在內存中,這樣可以更快的訪問序列號,當用完緩存中的所有序列號時,Oracle 將生成另外一組數值,並將其保留在內存中
NOCACHE :使用NOCACHE選項,則不會加快訪問速度而預先分配序列號,如果在創建序列時忽略了CACHE和NOCACHE選項,Oracle 將默認緩存20個序列號。
以下代碼創建了一個名為:emp_id的序列(序列號從10開始,自動增長為1,最大值為2000)
Create sequence mytable_id start with 10 increment by 1 maxvalue 2000
以下代碼把 emp_id 序列產生的值插入到mytable表中
insert into mytable values(mytableid.nextval,'rose','beijing','[email protected]',date'2007-10-10');
以下代碼修改了mytable_id 序列的信息。重新設置了新的 maxvalue 值以及設置增量值為2
Alter sequence mytable_id increment by 2 maxvalue 5000;
********* 注意 :不能修改序列的 start with 參數。
以下代碼演示了刪除一個序列
Drop sequence emp_id;
可以通過查詢user_sequence 字典表來獲取有關序列的信息。
user_sequence 表中的部分列
Sequence_name
序列名
Min_value
最小值
Max_value
最大值
Increment_by
序列的增量
Cycle_flag
該序列是否循環,該值為Y或N
Order_flag
該序列是否有序,該值為Y或N
Cache_size
保存在內存中的序列值的個數
Last_number
該序列生成或緩存的最後一個數字
以下查詢顯示了user_sequence表中的詳細信息
select * from user_sequences
刪除序列:
drop sequence mytable_id;
創建視圖:
視圖是在一個或者多個表上的預定義查詢。
以下代碼 在order_master 表中創建order_view 視圖
create or replace view order_view as select * from order_master where vencode='V001'
在視圖中使用 with check option 。修改視圖後在視圖中不能顯示修改的行。使用with check option 可以防止視圖數據被修改。
-- 在order_master 表中創建order_view 視圖 ,並且加了with check option 約束,
--如果修改 視圖中 vencode 列的值將違反 with check option 約束。
create or replace view order_view as select * from order_master where vencode='V001' with check option
--由於視圖中增加了with check option 約束
update order_view set vencode='V002' where orderno='o003'
--創建只讀視圖
create or replace view order_viewOnly as select * from order_master where vencode='V001' with read only
select * from order_viewonly
--試圖修改以上只讀視圖
update order_viewonly set ostatus='C' where orderno='V001'
創建帶有錯誤視圖:
下面語句創建一個基於表venmast 的視圖 ,但是在數據庫中並不存在名為“venmast”的表:
Create force view vtable as select * from viewtable;
使用索引
唯一索引:
唯一索引確保在定義索引的列中沒有重復值
Oracle 自動在表的主鍵列上創建唯一索引
使用CREATE UNIQUE INDEX語句創建唯一索引
以下代碼在jobs表的name列上創建了一個名為jobnameindex 的唯一索引:
create unique index jobnameindex on jobs(name);
alter index 語句的 rebuild 選項可以用來重建現有的索引,該語句效率高於使用drop index 和 create index 語句重新創建索引,下列語句演示如何重建jobnameindex索引:
alter index jobnameindex rebuild ;
組合索引:
組合索引是在表的多個列上創建的索引
索引中列的順序是任意的
如果 SQL 語句的 WHERE 子句中引用了組合索引的所有列或大多數列,則可以提高檢索速度
以下代碼在employee2 表中創建了組合索引:
create index comp_index on employees2(first_name,last_name);
反向鍵索引:
反向鍵索引反轉索引列鍵值的每個字節
通常建立在值是連續增長的列上,使數據均勻地分布在整個索引上
創建索引時使用REVERSE關鍵字
以下代碼演示了創建反向鍵索引
create index rev_inx on employees2(salary) reverse
使用noreverse關鍵字將反向鍵索引重建為標准索引:
alter index rev_inx rebuild noreverse;
位圖索引:
位圖索引適合創建在低基數列上
位圖索引不直接存儲ROWID,而是存儲字節位到ROWID的映射
減少響應時間
節省空間占用
以下代碼演示了如何創建位圖索引:
create bitmap index bit_inx on employees2(division_id);
基於函數的索引
基於一個或多個列上的函數或表達式創建的索引
表達式中不能出現聚合函數
不能在LOB類型的列上創建
創建時必須具有 QUERY REWRITE 權限
以下代碼演示了如何創建一個基於函數的索引
create index lowercase_inx on employees2(lower(job_id));
修改索引,以下代碼重命名了索引。
Alter index vn_ind rename to c_vn_ind;
刪除索引:
Drop index cvn_ind;
查看已創建的索引信息
select * from user_indexes
查看索引基於的列
select * from user_ind_columns