序列和索引
一.序列
1.序列的概念:
序列(Sequence)是用來生成連續的整數數據的對象。它常常用來作為主鍵的增長列,可以升序,也可以降序。
2.創建序列:
語法:創建序列 語法解析:
CREATE SEQUENCE sequence_name
[STRAT WITH num] START WITH:從某一個整數開始,升序默認為1,降序默認為-1.
[INCREMENT BY increment] INCREMENT BY:增長數。如果是正數則升序生成,負數則降序生成。升序默認為1,降序默認為-1。
[MAXVALUE num | NOMAXVALUE] MAXVALUE:最大值。 NOMAXVALUE:最大值的默認選項,升序為,10的27次冪,降序默認值為-1。
[MINVALUE num | NOMINVALUE] MINVALUE:最小值。 NOMINVALUE:最小值的默認選項,升序為1,降序為-10的26次冪。
[CYCLE | NOCYCLE] CYCLE:表示升序達到最大值的時候,從最小值開始。如果是降序的話,達到最小值后,從最大值開始。
NOCYCLE:表示達到最大或最小值時,不重新開始。(會報錯)。默認為NOCYCLE。
[CACHE num | NOCACHE] CACHE:使用CACHE選項時,該序列會根據序列規則生成一組序列號。保留在內存中,當使用下一個序列號時,可以更快的響應。
當內存中的序列號用完時,系統會再次生成一組序列號保存在緩存中,這樣可以提高生成序列號的效率。ORACLE會默認生成
20個序列號。
NOCACHE:不預先在內存中生成序列號。
示例:創建一個從5開始,每次增長3的序列,要求最大值為1000,CYCLE,緩存區有30個預選序列號。
create sequence aa start with 5 increment by 3 maxvalue 1000 cycle cache 30;
3.利用序列:
序列創建之后,我們可以通過序列對象的CURRVAL和NEXTVAL兩個‘偽列’來訪問序列的當前值和下一個值。
- 查看下一個值:
select aa.nextval from dual;
- 查看當前值:
select aa.currval from dual;
注意:當你剛創建好序列時,不能直接查看currval當前值,會報錯,因為你還沒有從序列中取值,所以currval是不被識別的。先取值(nextval,第一次為5),然后就可以查看當前值了。
- 利用序列插入數據。
我先創建一個表:
create table bb( id int primary key name varchar2(30); );
利用上個序列插入給id插入數據:
insert into bb values(aa.nextval,'MIKE');
插入了id為5,name為MIKE的一條數據。
4.序列的刪除和修改:
- 修改序列:
alter sequence aa maxvalue 200;
修改aa序列的最大值為200。其他屬性照例即可。
- 刪除序列:
drop sequence aa;
二:索引
1.索引的概念:
索引是與表關聯的可選結構。可以創建索引加快對表執行SQL語句的速度。就像書的索引可以幫助我們更快的查找信息一樣,Oracle中的索引也提供了一種更快的訪問數據的途徑。
2.什么情況下符合創建索引的條件:
- 在經常需要搜索的列上,可以加快搜索的速度。
- 在作為主鍵的列上,強制該列的唯一性和組織表中數據的排列結構。
- 在經常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度。
- 在經常需要根據范圍進行搜索的列上創建索引,因為索引已經排序,其指定的范圍是可見的,速度要快。
- 在經常使用where子句的列上面創建索引,加快條件的判斷速度。
3.什么情況下不應該創建索引:
- 很少查詢的列,只是作為參考的列,不應該創建索引。
- 對於那些數值很少的列。
- 對於那些定義為blob數據類型(大數據)的列。
- 經常增刪改的列,創建索引需謹慎。
4.索引的優點。
- 通過創建唯一性索引,可以保證數據庫表中沒一行數據的唯一性。
- 可以大大的加快數據的檢索速度,也是創建索引的最主要的原因。
- 可以加快表和表的連接,特別是在實現數據的參照完整性方面特別有意義。
- 在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。
- 通過使用檢索,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。
5.索引的缺點。
- 創建索引和維護索引要耗費時間,這種時間隨着數據量的增加而增加。
- 索引需要占物理空間,除了數據表占數據空間之外,每一個索引還要占一定的物理空間。
- 當對表中的數據進行增刪改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。
6.創建索引。
- 創建B-Tree索引:
語法: 語法分析:
CREATE [UNIQUE] INDEX index_name ON UNIQUE:意味着索引列中的值必須是唯一的。
table_name(column_name,[column_name...]) index_name:索引的名稱。
TABLESPACE tab_space; table_name:需要加索引的表名。
column_name:需要加索引的列(可以加多個列,這樣的索引稱為符合索引。)
tab_space:存貯索引的表空間。如果不指定的話,那么索引將會存貯在用戶默認的表空間下。(出於性能原因,可以將索引存貯的表
空間和實際表存貯的表空間分開。管理員應該為表和索引創建不同的表空間。)
示例:為emp員工表的員工號和薪水創建索引。
create index empno_sal_index on emp(empno,sal);
注意:如果你所要創建的索引的列的值有重復的值,那么就不能創建唯一索引。
- 創建函數索引。
如果我現在已經創建好了一個ename(員工姓名)列的索引,而現在想實現這樣的一條查詢語句。
select lower(ename) from emp;
那么這條語句雖然可以出來結果,但是卻沒有用到索引。這時我們就需要創建函數索引如下:
create index ename_index on emp(lower(ename));
- 創建位圖索引。
create bitmap index e_i on emp(ename);
什么情況下創建位圖索引:
- 列包含較大范圍的值
- 列包含大量空值
- 在where子句或者連接條件中頻繁使用一個列或者多個列
- 表相當的大,但是預計的多數查詢檢索的行數占總行數的比例較小,如占百分之十以下。
- 四個索引的總結。
默認的索引類型,平衡樹索引,適用於高基數(不同值的程度高)的列。除非有特殊原因需要使用不同的索引類型或功能,否則用正常的B樹索引即可.
B樹索引的一種形式,用於強制執行列值的唯一性.經常與主鍵和唯一鍵約束一起使用,但也可以獨立於約束而創建
對於包含低基數列以及在SQL語句的WHERE子句中使用許多AND或OR運算符的數據倉庫環境,非常適合使用這種索引。
適用於應用了SQL函數的列。可與B樹索引類型或位圖索引類型結合使用
7.查看索引信息。
SELECT index_name, table_name, uniqueness, status FROM user_indexes WHERE table_name IN ('EMP');
這個語句實現了查詢索引名字,索引的表名,是否是唯一索引,索引的狀態(是否可用)。結果截圖如下:
INVALID的話就是當前索引不可用。
8.修改、刪除索引。
- 修改索引:
alter index ename_index rename to ei;
更改索引名,其他修改格式都是如此。
- 刪除索引:
drop index ei;