1. 程式人生 > >Oracle_表空間、資料庫物件

Oracle_表空間、資料庫物件

1、Oracle資料庫物件

資料庫物件是資料庫的組成部分,常常用 CREATE 命令進行建立,可以使用 ALTER 命令修改,用 DROP 執行刪除操作。前面已經接觸過的資料庫物件有表、使用者等。

  • 同義詞:就是給資料庫物件一個別名。
  • 序列:Oracle 中實現增長的物件。
  •  檢視:預定義的查詢,作為表一樣的查詢使用,是一張虛擬表。
  • 索引:對資料庫表中的某些列進行排序,便於提高查詢效率。

2、同義詞

同義詞(Synonym)是資料庫物件的一個別名,Oracle 可以為表、檢視、序列、過程、函式、程式包等指定一個別名。同義詞有兩種型別:

  • 私有同義詞:擁有 CREATE SYNONYM 許可權的使用者(包括非管理員使用者)即可建立私有同義詞,建立的私有同義詞只能由當前使用者使用。
  • 公有同義詞:系統管理員可以建立公有同義詞,公有同義詞可以被所有使用者訪問。建立同義詞的語法是:

語法結構:同義詞

CREATE [OR REPLACE] [PUBLIC] SYSNONYM [schema.]synonym_name FOR [schema.]object_name

語法解析:

  1. CREATE [OR REPLACE:]表示在建立同義詞時,如果該同義詞已經存在,那麼就用新建立的同義詞代替舊同義詞。
  2. PULBIC:建立公有同義詞時使用的關鍵字,一般情況下不需要建立公有同義詞。③ Oracle 中一個使用者可以建立表、檢視等多種資料庫物件,一個使用者和該使用者下的所有資料庫物件的集合稱為 Schema(中文稱為模式或者方案),使用者名稱就是 Schema名。一個數據庫物件的全稱是:使用者名稱.物件名,即 schema.object_name。

如果一個使用者有許可權訪問其他使用者物件時,就可以使用全稱來訪問。比如:

程式碼演示:System 使用者訪問 Scott 使用者的 Emp 表

程式碼解析:
管理員使用者可以訪問任何使用者的資料庫物件,SYSTEM 使用者訪問 SCOTT 使用者的 EMP表時,必須使用 SCOTT.EMP。

案例 1:建立一個使用者 XiaoMei,該使用者擁有 CONNECT 角色和 RESOURCE 角色。為 SCOTT使用者的 EMP 表建立同義詞,並通過同義詞訪問該 EMP 表。

程式碼演示:建立同義詞並訪問

SQL> CREATE USER XiaoMei IDENTIFIED BY XiaoMei;
User created.
SQL> GRANT CONNECT TO XiaoMei;
Grant succeeded.
SQL> GRANT RESOURCE TO XiaoMei;
Grant succeeded.
SQL>  GRANT CREATE SYNONYM TO XiaoMei;
Grant succeeded.
SQL> conn XiaoMei/XiaoMei
Connected.
SQL> CREATE SYNONYM MyEmp FOR SCOTT.EMP;
Synonym created.
SQL> SELECT * FROM MYEMP;
SELECT * FROM MYEMP
              *
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> conn scott/tiger
Connected.
SQL>  GRANT ALL ON EMP TO XiaoMei;
Grant succeeded.
SQL> CONNECT XiaoMei/XiaoMei
Connected.
SQL>  SELECT ENAME,JOB,SAL FROM MyEmp WHERE SAL>2000;

ENAME      JOB              SAL
---------- --------- ----------
JONES      MANAGER         2975
BLAKE      MANAGER         2850
CLARK      MANAGER         2450
SCOTT      ANALYST         3000
KING       PRESIDENT       5000
FORD       ANALYST         3000

6 rows selected.

程式碼解析:

  • 在管理員使用者下建立使用者 XiaoMei,對使用者 XiaoMei 授予 CONNECT 和 RESOURCE 角色。為了 XiaoMei 能夠建立序列,必須授予系統許可權:CREATE SYNONYM。
  • 在 XiaoMei 使用者下,為 SCOTT.EMP 建立私有同義詞 MyEmp,同義詞 MyEmp 只能在XiaoMei 使用者下使用。訪問 MyEmp 就是訪問 SCOTT.EMP 物件。
  • 訪問 MyEmp 物件出錯:物件不存在。因為 XiaoMei 如果訪問 MyEmp,就相當於訪問 SCOTT.EMP 物件,那麼 SCOTT 使用者必須對 XiaoMei 授予相應的許可權。④ SCOTT 使用者下,把 EMP 表的所有許可權(增刪改查)授予 XiaoMei。
  • 對 MyEmp 執行查詢操作。MyEmp 就可以像在本地的表一樣使用。

刪除同義詞使用的語法是:

語法結構:刪除同義詞

DROP [PUBLIC] SYNONYM [schema.]sysnonym_name

語法解析:

  1. PUBLIC:刪除公共同義詞。
  2. 同義詞的刪除只能被擁有同義詞物件的使用者或者管理員刪除。
  3. 此命令只能刪除同義詞,不能刪除同義詞下的源物件。

3. 序列

序列(Sequence)是用來生成連續的整數資料的物件。序列常常用來作為主鍵中增長列,序列中的可以升序生成,也可以降序生成。建立序列的語法是:

語法結構:建立序列

CREATE SEQUENCE sequence_name
[START WITH num]
[INCREMENT BY increment]
[MAXVALUE num|NOMAXVALUE]
[MINVALUE num|NOMINVALUE]
[CYCLE|NOCYCLE]
[CACHE num|NOCACHE]

語法解析:

  1. START WITH:從某一個整數開始,升序預設值是 1,降序預設值是-1。
  2. INCREMENT BY:增長數。如果是正數則升序生成,如果是負數則降序生成。升序預設值是 1,降序預設值是-1。
  3. MAXVALUE:指最大值。
  4. NOMAXVALUE:這是最大值的預設選項,升序的最大值是:1027,降序預設值是-1。
  5. MINVALUE:指最小值。
  6. NOMINVALUE:這是預設值選項,升序預設值是 1,降序預設值是-1026。
  7. CYCLE:表示如果升序達到最大值後,從最小值重新開始;如果是降序序列,達到最小值後,從最大值重新開始。
  8. NOCYCLE:表示不重新開始,序列升序達到最大值、降序達到最小值後就報錯。預設 NOCYCLE。
  9. CACHE:使用 CACHE 選項時,該序列會根據序列規則預生成一組序列號。保留在記憶體中,當使用下一個序列號時,可以更快的響應。當記憶體中的序列號用完時,系統再生成一組新的序列號,並儲存在快取中,這樣可以提高生成序列號的效率。Oracle預設會生產 20 個序列號。
  10. NOCACHE:不預先在記憶體中生成序列號。

案例 2:建立一個從 1 開始,預設最大值,每次增長 1 的序列,要求 NOCYCLE,快取中有 30 個預先分配好的序列號。

程式碼演示:生成序列號

使用 ALTER SEQUENCE 可以修改序列,在修改序列時有如下限制:
1. 不能修改序列的初始值。
2. 最小值不能大於當前值。
3. 最大值不能小於當前值。

使用 DROP SEQUENCE 命令可以刪除一個序列物件。

程式碼演示:序列修改和刪除

4、檢視

檢視(View)實際上是一張或者多張表上的預定義查詢,這些表稱為基表。從檢視中查詢資訊與從表中查詢資訊的方法完全相同。只需要簡單的 SELECT…FROM 即可。
檢視具有以下優點:

  1. 可以限制使用者只能通過檢視檢索資料。這樣就可以對終端使用者遮蔽建表時底層的基表。
  2. 可以將複雜的查詢儲存為檢視。可以對終端使用者遮蔽一定的複雜性。
  3. 限制某個檢視只能訪問基表中的部分列或者部分行的特定資料。這樣可以實現一定的安全性。
  4. 從多張基表中按一定的業務邏輯抽出使用者關心的部分,形成一張虛擬表。

語法結構:建立檢視

CREATE [OR REPLACE] [{FORCE|NOFORCE}] VIEW view_name AS
SELECT查詢
[WITH READ ONLY CONSTRAINT]

語法解析:

  1. OR REPLACE:如果檢視已經存在,則替換舊檢視。
  2. FORCE:即使基表不存在,也可以建立該檢視,但是該檢視不能正常使用,當基表建立成功後,檢視才能正常使用。
  3. NOFORCE:如果基表不存在,無法建立檢視,該項是預設選項。
  4. WITH READ ONLY:預設可以通過檢視對基表執行增刪改操作,但是有很多在基表上的限制(比如:基表中某列不能為空,但是該列沒有出現在檢視中,則不能通過檢視執行 insert 操作),WITH READ ONLY 說明檢視是隻讀檢視,不能通過該檢視進行增刪改操作。現實開發中,基本上不通過檢視對錶中的資料進行增刪改操作。

案例 3:基於 EMP 表和 DEPT 表建立檢視

程式碼解析:

  • 對檢視可以像表一樣進行查詢。該檢視中隱藏了員工的工資。
  • 刪除檢視可以使用“DROP VIEW 檢視名稱”,刪除檢視不會影響基表的資料。

5. 索引

建立索引就是對某些特定列中的資料排序,生成獨立的索引表。在某列上建立索引後,如果該列出現在查詢條件中,Oracle 會自動的引用該索引,先從索引表中查詢出符合條件記錄的 ROWID,由於 ROWID 是記錄的實體地址,因此可以根據 ROWID 快速的定位到具體的記錄,表中的資料非常多時,引用索引帶來的查詢效率非常可觀。

  • 如果表中的某些欄位經常被查詢並作為查詢的條件出現時,就應該考慮為該列建立索引。
  • 當從很多行的表中查詢少數行時,也要考慮建立索引。有一條基本的準則是:當任何單個查詢要檢索的行少於或者等於整個錶行數的 10%時,索引就非常有用。

Oracle 資料庫會為表的主鍵和包含唯一約束的列自動建立索引。索引可以提高查詢的效率,但是在資料增刪改時需要更新索引,因此索引對增刪改時會有負面影響。

語法結構:建立索引

CREATE [UNIQUE] INDEX index_name ON table_name(column_name[,column_name…])

語法解析:

  1. UNIQUE:指定索引列上的值必須是唯一的。稱為唯一索引。
  2. index_name:指定索引名。
  3. tabl_name:指定要為哪個表建立索引。
  4. column_name:指定要對哪個列建立索引。我們也可以對多列建立索引;這種索引稱為組合索引。

案例 4:為 EMP 表的 ENAME 列建立唯一索引,為 EMP 表的工資列建立普通索引,把JOB 列先變為小寫再建立索引。

程式碼解析:

  • 第一句為 SCOTT.EMP 表的 ENAME 列建立唯一索引。
  • 第二句為 SCOTT.EMP 表的 SAL 列建立索引。
  • 第三句在查詢中可能經常使用 job 的小寫作為條件的表示式,因此建立索引時,可以先對JOB 列中的所有值轉換為小寫後建立索引,而這時需要使用 lower 函式,這種索引稱為基於函式的索引。

在 select 語句查詢時,Oracle 系統會自動為查詢條件上的列應用索引。索引就是對某一列進行排序,因此在索引列上,重複值越少,索引的效果越明顯。
Oracle 可以為一些列值重複非常多且值有限的列(比如性別列)上建立點陣圖索引。

6. 表空間

在資料庫系統中,儲存空間是較為重要的資源,合理利用空間,不但能節省空間,還可以提高系統的效率和工作效能。Oracle 可以存放海量資料,所有資料都在資料檔案中儲存。而資料檔案大小受作業系統限制,並且過大的資料檔案對資料的存取效能影響非常大。同時Oracle 是跨平臺的資料庫,Oracle 資料可以輕鬆的在不同平臺上移植,那麼如何才能提供統一存取格式的大容量呢?Oracle 採用表空間來解決。

表空間只是一個邏輯概念,若干作業系統檔案(檔案可以不是很大)可以組成一個表空間。表空間統一管理空間中的資料檔案,一個數據檔案只能屬於一個表空間。一個數據庫空間由若干個表空間組成。如圖所示:

Oracle 中所有的資料(包括系統資料),全部儲存在表空間中,常見的表空間有:

  • 系統表空間:存放系統資料,系統表空間在資料庫建立時建立。表空間名稱為SYSTEM。存放資料字典和檢視以及資料庫結構等重要系統資料資訊,在執行時如果 SYSTEM 空間不足,對資料庫影響會比較大,雖然在系統執行過程中可以通過命令擴充空間,但還是會影響資料庫的效能,因此有必要在建立資料庫時適當的把資料檔案設定大一些。
  • TEMP 表空間:臨時表空間,安裝資料庫時建立,可以在執行時通過命令增大臨時表空間。臨時表空間的重要作用是資料排序。比如當用戶執行了諸如 Order by 等命令後,伺服器需要對所選取資料進行排序,如果資料很大,記憶體的排序區可能裝不下太大資料,就需要把一些中間的排序結果寫在硬碟的臨時表空間中。
  • 使用者表自定義空間:使用者可以通過 CREATE TABLESPACE 命令建立表空間。

建立表空間需要考慮資料庫對分割槽(Extent,一個 Oracle 分割槽是資料庫檔案中一段連續的空間,Oracle 分割槽是 Oracle 管理中最小的單位)的管理,比如當一個表建立後先申請一個分割槽,在 Insert 執行過程中,如果分割槽資料已滿,需要重新申請另外的分割槽。如果一個數據庫中的分割槽大小不一,建立表空間時需要考慮一系列問題。因此在 Oracle8i 之後,建立表空間都推薦使用“本地管理表空間”,這種表空間中的分割槽是一個固定大小的值,建立表空間的語法是:

語法結構:建立表空間

CREATE TABLESPACE 空間名稱
DATAFILE '檔名1' SIZE 數字M
[,'檔名2' SIZE 數字….]EXTENT MANAGEMENT LOCAL UNIFORM SIZE 數字M

語法解析:

  1. 檔名包括完整路徑和檔名,每個資料檔案定義了檔案的初始大小,初始大小一般以“M”為單位。一個表空間中可以有多個數據檔案。
  2. EXTENT MANAGEMENT LOCAL 指明表空間型別是:本地管理表空間。本地管理表空間要求 Oracle 中的資料分割槽(Extent)大小統一。
  3. UNIFORM SIZE:指定每個分割槽的統一大小。

案例 5:建立一個表空間,包含兩個資料檔案大小分別是 10MB,5MB,要求 extent 的大小統一為 1M。

程式碼演示:建立表空間

CREATE TABLESPACE MYSPACE
  DATAFILE '/home/oracle/A.ORA' SIZE 10M
  AUTOEXTEND ON 
  NEXT 50M MAXSIZE 20480M 
  EXTENT MANAGEMENT LOCAL;

必須是管理員使用者才能建立表空間,當表空間的空間不足時可以使用 ALTER TABLESPACE命令向表空間中追加資料檔案擴充表空間。

程式碼演示:擴充表空間

ALTER TABLESPACE MYSPACE ADD DATAFILE '/home/oracle/B.ORA' SIZE 10M 

表空間可以在不使用時刪除,使用 DROP TABLESPACE 命令。
 資料庫的所有資料全部在某一表空間中存放,在建立使用者時,可以為使用者指定某一表空間,那麼該使用者下的所有資料庫物件(比如表)預設都儲存在該空間中。

程式碼演示:為某一使用者指定預設表空間

CREATE USER ACONG IDENTIFIED BY ACONG DEFAULT TABLESPACE MYSPACE

在建立表時,表中資料存放在使用者的預設表空間中,也可以通過 tablespace 子句為表指定表中資料存放在其他表空間中。

程式碼演示:為表指定表空間

CREATE TABLE SCORES
 (
  ID NUMBER ,
  TERM VARCHAR2(2),
  STUID VARCHAR2(7) NOT NULL,
  EXAMNO VARCHAR2(7) NOT NULL,
  WRITTENSCORE NUMBER(4,1) NOT NULL,
  LABSCORE NUMBER(4,1) NOT NULL
)
TABLESPACE MYSPACE

建立索引時也可以為索引指定表空間。

程式碼演示:為索引指定表空間

CREATE INDEX UQ_ID ON SCORES(ID) TABLESPACE MYSPACE;

表和索引一旦建立,表空間無法修改。