資料說明和動態效能視觀表

每一個 Oracle 資料庫的一組唯讀參照表格與視觀表統稱為資料說明。動態效能視觀表是在資料庫開啟和使用中時持續更新的特殊視觀表。

資料說明概要

Oracle 資料庫的重要部分就是其資料說明,此為一組唯讀的表格,提供資料庫的管理描述資料。

資料說明的用途

資料說明包含描述資料庫內容的描述資料。

例如,資料說明包含下列資訊:

資料管理

資料說明是每個 Oracle 資料庫資料管理的核心部分。

例如,資料庫會執行下列動作:

因為 Oracle AI Database 將資料說明資料儲存在表格中,就像其他資料一樣,使用者可以使用 SQL 查詢資料。例如,使用者可以執行 SELECT 敘述句來決定其權限,哪些表格存在於其綱要中、哪些資料欄位於這些表格中、是否在這些資料欄上建立索引等等。

另請參閱:

CDB 中的資料說明區隔

在 CDB 中,資料說明描述資料是分割到 CDB 根與 PDB 之間。從使用者和應用程式角度來看,CDB 中每個容器中的資料說明是分開的。

在新建立的 CDB 中尚未包含使用者資料,CDB 根目錄中的資料說明只包含系統描述資料。例如,TAB$ 表格包含僅描述 Oracle 提供之表格的資料列,例如 TRIGGER$ 和 SERVICE$。下圖說明三個基礎資料說明表格,紅色長條表示系統的資料列。

圖 1:CDB 根目錄中的資料說明描述資料

cncpt_vm_363.png 圖解描述

假設您建立一個 PDB,然後建立一個包含此 PDB 中之 employees 和 departments 表格的 hr 綱要。PDB 中的資料說明包含一些描述 Oracle 提供之實體的資料列,以及其他描述使用者建立之實體的資料列。例如,PDB 說明中的 TAB$ 表格有一個 employees 表格的描述資料資料列,以及一個 departments 表格的資料列。

圖 2:CDB 中的資料說明架構

cncpt_vm_361.png 圖解描述

上圖顯示 PDB 中的資料說明包含 CDB 根中資料說明的指標。在內部,Oracle 提供的物件 (例如資料說明表格定義和 PL/SQL 套裝程式) 會在 CDB 根目錄中只代表一次。此架構實現了 CDB 內的兩個主要目標:

資料說明元件

資料說明是由基礎表格與視觀表所組成。

這些物件的定義如下:

通常,資料說明視觀表會分組為多個集合。在許多情況下,集合由三個檢視組成,其中包含類似的資訊,並依其字首加以區別,如下表所示。藉由查詢適當的檢視,您只能存取與您相關的資訊。

表格 1 資料說明視觀表集

字首 使用者存取 內容 備註
DBA_ 資料庫系統管理員 所有的物件 部分 DBA_ 視觀表具有其他資料欄,其中包含對管理員有用的資訊。
ALL_ 所有使用者 使用者具有權限的物件 包括使用者擁有的物件。這些視觀表會遵守目前啟用的一組角色。
USER_ 所有使用者 使用者擁有的物件 前置碼為 USER_ 的檢視通常會排除資料欄 OWNER。此資料欄隱含在 USER_ 視觀表中,作為發出查詢的使用者。

並非所有檢視集都有三個成員。例如,資料說明包含 DBA_LOCK 視觀表,但沒有 ALL_LOCK 視觀表。

系統提供的 DICTIONARY 視觀表包含所有資料說明視觀表的名稱與縮寫描述。此視觀表的下列查詢包括部分範例輸出:

SQL> SELECT * FROM DICTIONARY
  2  ORDER BY TABLE_NAME;

TABLE_NAME                     COMMENTS
------------------------------ ----------------------------------------
ALL_ALL_TABLES                 Description of all object and relational
                               tables accessible to the user

ALL_APPLY                      Details about each apply process that
                               dequeues from the queue visible to the
                               current user
.
.
.

另請參閱:

CDB 中的容器資料物件

容器資料物件是一個表格或視觀表,其中包含多個容器或整個 CDB 相關的資料。

容器資料權限支援多個 PDB 位於單一 CDB,但具有不同本機管理需求的一般需求。例如,如果應用程式 DBA 不想在本機管理,他們就可以將適當視觀表的容器資料權限授予通用使用者。在此情況下,CDB 管理員可以存取這些 PDB 的資料。相反的,不希望 CDB 管理員存取其資料的 PDB 管理員,也不會授予容器資料權限。

容器資料物件的範例為 Oracle 提供的視觀表,其名稱開頭為 V$ 和 CDB_。所有容器資料物件都有一個 CON_ID 資料欄。下表顯示此資料欄值的意義。

表格 2 貨櫃 ID 值

貨櫃 ID 與下列項目相關的資料列:
0 整個 CDB
1 CDB$ROOT
2 PDB$SEED
所有其他 ID 使用者建立的 PDB、應用程式根目錄或應用程式原始內建值

在 CDB 中,每個 DBA_ 視觀表都有對應的 CDB_ 視觀表。CDB_ 視觀表的擁有者是對應 DBA_ 視觀表的擁有者。下圖顯示說明視觀表之不同類別之間的關係:

圖 3:CDB 中的說明視觀表

cncpt_vm_366.png 圖解描述

當目前的容器為 PDB 時,使用者只能檢視目前 PDB 的資料說明資訊。不過,當目前的容器是 CDB 根時,通用使用者可以查詢 CDB_ 視觀表來查看 CDB 根目錄與具有此使用者權限之 PDB 的描述資料。注意:從 CDB 根查詢時,CDB_ 和 V$ 視觀表會隱含地將資料轉換成 AL32UTF8 字元集。如果字元集在轉換成 AL32UTF8 時需要更多位元組來代表字元,且檢視資料欄寬度無法容納特定 PDB 的資料,則可能會截斷資料。

下表說明 CDB_ 視觀表的查詢。每一列都描述在前一列的動作後所發生的動作。

表格 3 查詢 CDB_ 視觀表

作業 說明
SQL> CONNECT SYSTEM
 Enter password: ********
 Connected.

SYSTEM 使用者 (CDB 中所有容器通用的) 會連線至 CDB 根 (請參閱「通用使用者帳戶」 )。

SQL> SELECT COUNT(*) FROM CDB_USERS
  WHERE CON_ID=1;

  COUNT(*)
 --------
 38
SYSTEM 會查詢 CDB_USERS,以取得 CDB 根中的通用使用者數目。輸出指出 38 個通用使用者存在於 CDB 根中。
SQL> SELECT COUNT(DISTINCT(CON_ID))
  FROM CDB_USERS;

  COUNT(DISTINCT(CON_ID))
 -----------------------
 4
SYSTEM 會查詢 CDB_USERS 來判斷 CDB 中不同容器的數目。
SQL> CONNECT SYSTEM@hrdb
 Enter password: ********
 Connected.
SYSTEM 使用者現在會連線到名為 hrpdb 的 PDB。
SQL> SELECT COUNT(*) FROM CDB_USERS;

  COUNT(*)
 ----------
 48
SYSTEM 查詢 CDB_USERS。輸出指示目前的容器中有 48 個通用使用者和本機使用者,亦即 hrpdb。
SQL> SELECT COUNT(*) FROM DBA_USERS;

  COUNT(*)
 ----------
 48
SYSTEM 查詢 DBA_USERS。輸出與上一個查詢相同。由於 SYSTEM 未連線至 CDB 根,因此 DBA_USERS 視觀表會顯示與 CDB_USERS 相同的輸出。由於 DBA_USERS 只會顯示目前容器中的使用者,因此會顯示 48。

前置碼為 DBA_ 的檢視

前置碼為 DBA_ 的檢視會顯示整個資料庫中的所有相關資訊。DBA_ 檢視僅供管理員使用。

下列範例查詢顯示資料庫中所有物件的相關資訊:

SELECT OWNER, OBJECT_NAME, OBJECT_TYPE
FROM   DBA_OBJECTS
ORDER BY OWNER, OBJECT_NAME;

另請參閱:Oracle AI Database Administrator's Guide,瞭解管理權限的詳細資訊

前置碼為 ALL_ 的檢視

前置碼為 ALL_ 的視觀表指的是使用者的整體資料庫觀點。

這些視觀表會傳回除了使用者擁有的綱要物件之外,使用者可透過公用或明確的權限與角色授權來存取之綱要物件的相關資訊。

例如,下列查詢會傳回您有權存取之所有物件的相關資訊:

SELECT OWNER, OBJECT_NAME, OBJECT_TYPE
FROM   ALL_OBJECTS
ORDER BY OWNER, OBJECT_NAME;

由於 ALL_ 視觀表遵守目前的一組啟用的角色,因此查詢結果取決於啟用的角色,如下列範例所示:

SQL> SET ROLE ALL;

Role set.

SQL> SELECT COUNT(*) FROM ALL_OBJECTS;

COUNT(*)
----------
68295

SQL> SET ROLE NONE;

Role set.

SQL> SELECT COUNT(*) FROM ALL_OBJECTS;

COUNT(*)
----------
53771

在預存程序中使用 ALL_ 檢視時 (預設不會啟用角色),應用程式開發人員應該認知角色的影響。

前置碼為 USER_ 的檢視

對一般資料庫使用者最可能感興趣的檢視是字首為 USER_ 的檢視。

這些檢視:

例如,下列查詢會傳回綱要中包含的所有物件:

SELECT OBJECT_NAME, OBJECT_TYPE
FROM   USER_OBJECTS
ORDER BY OBJECT_NAME;

DUAL 表格

DUAL 是資料說明中的小型表格,Oracle AI Database 和使用者撰寫的程式可參考這些表格來保證已知的結果。

當值必須只傳回一次 (例如,目前的日期與時間) 時,雙重表格就很有用。所有資料庫使用者都可以存取 DUAL。

DUAL 表格有一個名為 DUMMY 的資料欄,以及一個包含 X 值的資料列。下列範例會查詢 DUAL 以執行算術運算:

SQL> SELECT ((3*4)+5)/3 FROM DUAL;

((3*4)+5)/3
-----------
 5.66666667

另請參閱:Oracle AI Database SQL Language Reference,瞭解有關 DUAL 表格的詳細資訊

資料說明的運作方式

Oracle AI Database 使用者帳戶 SYS 擁有資料字典的所有基礎表格和使用者可存取的檢視。

在資料庫作業期間,Oracle AI Database 會讀取資料說明,以確定綱要物件存在,且使用者具有適當的存取權。Oracle AI Database 會持續更新資料說明,以反映資料庫結構、稽核、授權和資料的變更。

例如,如果使用者 hr 建立名為 interns 的表格,則資料庫會將新資料列新增至資料說明,以反映 hr 在表格上的新表格、資料欄、區段、擴充區塊以及權限。下次查詢字典視觀表時,就會看到這個新資訊。

資料字典基礎表格中的資料是 Oracle AI Database 正常運作的必要資料。只有 Oracle AI Database 才應該寫入或變更資料字典資訊。Oracle AI Database 使用者不應該永久更改 SYS 綱要中包含的資料列或綱要物件,因為這類活動可能會影響資料完整性。負責安全的管理員必須嚴加控制此核心帳戶。

警告:更改或操控資料說明表格中的資料可能會永久產生影響資料庫作業。

中繼資料與資料連結

CDB 使用內部連結機制來分隔資料說明資訊。

具體而言,Oracle AI Database 使用下列自動管理的指標:

Oracle AI Database 會自動建立和管理 CDB$ROOT 的中繼資料和資料連結。使用者無法新增、修改或移除這些連結。

另請參閱:

資料說明視觀表的公用同義字

Oracle AI Database 為許多資料字典檢視建立公用同義字,讓使用者能夠輕鬆存取。

安全管理員也可以為全系統使用的綱要物件建立其他公用同義字。Oracle 建議針對專用綱要物件和公用同義字使用相同的名稱。

另請參閱:「同義字簡介」

資料字典快取

因為資料庫會持續要求資訊來驗證使用者存取權,並驗證綱要物件的狀態,所以大部份的資料說明資訊都位於資料說明快取中。

快取通常包含剖析資訊。描述表格及其資料欄的 COMMENTS 資料欄不會快取至說明快取中,但可以快取至資料庫緩衝區快取中。

另請參閱:「資料說明快取」

其他程式與資料字典

其他 Oracle AI Database 產品可以參考現有檢視,並自行建立其他資料字典表格或檢視。

Oracle 建議撰寫參照資料說明之程式的應用程式開發人員使用公用同義字,而非基礎表格。同義字在不同發行版本之間較不容易變更。

資料說明儲存體

將 CDB 的描述資料儲存為整體的資料說明,只會儲存在系統表格空間中。

儲存特定 PDB 之描述資料的資料說明會儲存在專用於此 PDB 的獨立表格空間中。PDB 表格空間包含應用程式後端的資料與描述資料。因此,每組資料說明表格都會儲存在自己的一組專用表格空間中。

另請參閱:SYSTEM 表格空間,瞭解有關 SYSTEM 表格空間的詳細資訊

動態效能視觀表概要

在整個作業中,Oracle AI Database 會維護一組記錄目前資料庫活動的虛擬表格。

這些視觀表是動態的,因為在資料庫開啟和使用中時會持續更新。視觀表有時稱為 V$ 視觀表,因為它們的名稱開頭為 V$。

動態效能視觀表包含下列資訊:

動態效能視觀表的主要用途如下:

動態效能視觀表的內容

動態效能視觀表稱為固定視觀表,因為資料庫管理員無法更改或移除它們。不過,資料庫管理員可以在表格上查詢和建立視觀表,並將這些視觀表的存取權授與其他使用者。

SYS 擁有動態效能表格,其名稱開頭為 V_$。檢視會在這些表格上建立,然後以 V$ 開頭的公用同義字建立。例如,V$DATAFILE 視觀表包含資料檔的相關資訊。V$FIXED_TABLE 檢視包含所有動態效能表格與檢視的相關資訊。

幾乎每一個 V$ 視觀表都有對應的 GV$ 視觀表。在 Oracle Real Application Clusters (Oracle RAC) 中,查詢 GV$ 視觀表會從所有合格的資料庫執行處理擷取 V$ 視觀表資訊。

當您使用「資料庫組態輔助程式 (DBCA)」建立資料庫時,Oracle 會自動建立資料說明。Oracle AI Database 會自動執行 catalog.sql 指令碼,其中包含動態效能檢視的檢視與公用同義字定義。您必須執行 catalog.sql,才能建立這些檢視和同義字。

另請參閱:

動態效能視觀表的儲存體

動態效能視觀表的基礎是虛擬表格,而虛擬表格是從資料庫記憶體結構建立的。

視觀表並不會儲存在資料庫中的傳統表格。不保證視觀表的讀取一致性,因為資料會動態更新。

因為動態效能視觀表不是 true 表格,所以資料會視資料庫和資料庫執行處理的狀態而定。例如,您可以在啟動但未掛載資料庫時查詢 V$INSTANCE 和 V$BGPROCESS。不過,在掛載資料庫之前,您無法查詢 V$DATAFILE。

另請參閱:「資料並行與一致性」

資料庫物件描述資料

DBMS_METADATA 套裝程式和 DBMS_DEVELOPER.GET_METADATA 函數提供擷取資料庫物件完整定義的介面。

使用 DBMS_METADATA 套裝程式時,可以用 XML 或 SQL DDL 來表示定義。Oracle AI Database 提供兩種介面樣式:用於程式設計控制的彈性複雜介面,以及用於特設查詢的簡化介面。

使用 DBMS_DEVELOPER.GET_METADATA 函數時,物件中繼資料會傳回為 JSON 文件。

另請參閱:Oracle AI Database PL/SQL Packages and Types Reference,瞭解有關 DBMS_METADATA 的詳細資訊。Oracle AI Database PL/SQL Packages and Types Reference,瞭解 DBMS_DEVELOPER.GET_METADATA 的詳細資訊。