Oracle序列和索引


序列和索引

一.序列

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);

 

  什么情況下創建位圖索引:

  1. 列包含較大范圍的值
  2. 列包含大量空值
  3. 在where子句或者連接條件中頻繁使用一個列或者多個列
  4. 表相當的大,但是預計的多數查詢檢索的行數占總行數的比例較小,如占百分之十以下。
  •     四個索引的總結。
  B樹

      默認的索引類型,平衡樹索引,適用於高基數(不同值的程度高)的列。除非有特殊原因需要使用不同的索引類型或功能,否則用正常的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;

  


免責聲明!

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



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