初入Oracle 編程藝術_基本概念

接觸Oracle數據庫也有一年多了,之前對於Oracle數據庫也就停留在簡單的增、刪、改、查,數據庫創建,會寫一些SQL,能夠使用JDBC開發項目。對於Oracle數據庫的很多認識都是欠缺的,停留在很膚淺的層面,這段時間重新深入的學習了一些知識,包括Linux常用命令、操作系統、Oracle官方手冊,知道自己欠缺的知識太多了,非一朝一夕可以填補這個空白的,對於一個半道出家的來說缺少系統的學習,在很多方面學起來還是挺吃力的。這篇是我學習做的筆記,一些比較常用到的概念知識,總體來說筆記還是挺混亂的,也就是以防自己遺忘。

SQL語言分爲四大類

數據查詢語言(DQL)、數據操縱語言(DML)、數據定義語言(DDL)、數據控制語言(DCL)

  • 數據查詢語言DQL: select

  • 數據操縱語言DML: insert、update、delete

  • 數據定義語言DDL: 數據定義語言用來創建數據庫中的各種對象,表,視圖,索引,同義詞,聚簇等。(DDL操作是隱形提交的。不能rollback)

  • 數據控制語言DCL: 數據控制語言DCL用來授予或回收訪問數據庫的某種特權,並控制數據庫操縱事務發生的時間及效果,對數據庫實行監視等。

數據控制語言包括:

  • grant(授權)
  • rollback(回滾)
  • rollback [work] to [savepoint]:回退到指定時間點。
  • commit(提交)

在數據庫的插入、刪除和修改操作時,只有當事務在提交到數據庫時纔算完成。在事務提交前,只有操作數據庫的這個人纔能有權看到所做的事情,別人只有在最後提交完成後纔可以看到。
提交數據有三種類型:顯式提交、隱式提交及自動提交。下面分別說明這三種類型。

(1) 顯式提交

用COMMIT命令直接完成的提交爲顯式提交。其格式爲:

SQL>COMMIT;

(2) 隱式提交

用SQL命令間接完成的提交爲隱式提交。這些命令是:

ALTER,AUDIT,COMMENT,CONNECTCREATEDISCONNECTDROP,
EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。

(3) 自動提交

若把AUTOCOMMIT設置爲ON,則在插入、修改、刪除語句執行後,
系統將自動進行提交,這就是自動提交。其格式爲:

SQL>SET AUTOCOMMIT ON

數據庫和實例

  • 數據庫(database):物理操作系統文件或磁盤(disk)的集合。使用Oracle的自動存儲管理(Automatic Storage Management,ASM)或RAW分區時,數據庫可能不作爲操作系統中單獨的文件,淡定一任然不變。

  • 實例(instance):一組Oracle後臺進程/線程以及一個共享內存區,這些內存由同一個計算機上運行的線程/進程所共享。這裏可以維護易失的、非持久性內容(有些可以刷新輸出到磁盤)。就算沒有磁盤存儲,數據庫實例也能存在。

模式對象模型

  • 索引

索引是一種模式對象,對於每一個被索引的錶行或表簇行,索引都包含一個條目,以提供直接、快速的存取。Oracle數據庫支持幾種類型的索引。B-樹索引,位圖索引。

  • 分區

分區是大型表和索引的分片。

  • 視圖

視圖是對一個或多個表、或其他視圖中的數據的自定義表示。

  • 序列

序列是一個由用戶創建的對象,可以被多個用戶共享,用於生成整數。通常,序列用於生成主鍵值。

  • 維度

維度定義多個列集之間的父-子關係,列集中的所有列必須都來自同一個表。維度通常用於對客戶、產品、和時間之類的數據進行分類。

  • 同義詞

同義詞是另一個模式對象的別名。因爲同義詞只是一個別名,它在數據字典中除了其定義之外,沒有存儲。

  • PL/SQL子程序和包

PL/SQL是Oracle對sql的過程化擴展。PL/SQL塊,可以帶參數調用。PL/SQL包用於將邏輯上相關的PL/SQL類型、變量、和子程序進行分組。

SYS和SYSTEM模式

SYS管理賬戶在創建數據庫時自動創建。此賬戶可以執行所有的數據庫管理功能。SYS模式存儲數據字典基表和視圖。SYS模式中的表只由數據庫操作,決不能被任何用戶修改。

在創建數據庫時,也會自動創建SYSTEM賬戶。SYSTEM模式存儲其它一些用於顯示管理信息的表和視圖,以及用於各種數據庫選項和工具的內部表和視圖。永遠不要使用SYSTEM模式來存儲非管理性用戶的表。

Oracle數據庫表分爲以下幾個基本類型:

  • 關係表
  • 對象表,列對應於對象類型的頂層屬性。
  • 堆組織表,它不會以任何特定順序存儲行。
  • 索引組織表,它按主鍵值對行進行排序。
  • 外部表,是一個只讀表,它的元數據存儲在數據庫中,但其數據存儲在數據庫外。

rowid數據類型

存儲在數據庫中的每一行都有一個地址。
物理rowids存儲堆組織表、表簇、表分區和索引分區中的行地址。
邏輯rowids存儲索引組織表中的行地址
外部rowids是外來表(如通過網關訪問的DB2表)中的標識符。

rowid的功能:

rowids是訪問特定行的最快方式
rowids提供了查看錶的組織方式的能力。
rowids是給定表中的行的唯一標識符。

ROWID僞列

Oracle數據庫中的每個表都有一個名爲ROWID的僞列。並不佔用存儲空間。僞列的值是表示每個行的地址的字符串。

基本/OLTP表壓縮

基於字典的表壓縮提供了很好的壓縮率。
基本表壓縮:這種類型的壓縮只能壓縮由直接路徑加載插入的數據,只支持有限的數據類型和SQL操作。

OLTP表壓縮:這種類型的壓縮用於OLTP應用程序,並可壓縮任何SQL操作的數據。

數據庫以行主要格式存儲壓縮行。一個行的所有列都存儲在一起,接下來是下一行的所有列,依次類推。

表簇
表簇是一組表,它們共享公共的列,並將相關的數據存儲在相同的數據塊中。當表被聚簇時,單個數據塊可以包含多個表中的行。
簇鍵是所有被聚簇的表的共有列或列集。如emp表和dept表的dept_id列。

索引化表簇概述
索引化聚簇是使用索引來查找數據的表簇。而簇索引是一個簇鍵上的B*樹索引。索引必須先被創建,然後才能將行插入到表簇中。

哈希簇概述
索引鍵被替換爲一個哈希函數,哈希簇就像一個索引化聚簇。它沒有單獨的簇索引存在,對於一個哈希簇來說,數據本身就是索引。

哈希簇變體
單表哈希簇是哈希簇的優化版本,一次只支持一個表,哈希鍵和行之間存在一一映射。
排序哈希簇存儲哈希函數的每個值對應的行,通過某種方式,數據庫可以有效的把他們按已排定的順序返回。

索引和索引組織表

索引概述

索引是一種與表簇相關聯的可選結構,有時可以提高數據訪問速度。通過在表中的一個或多個列上創建索引,在某些情況下使您能夠快速地從隨機分佈的錶行中檢索一小部分行。索引是減少磁盤I/O的許多手段之一。

在一下情況可以考慮在某列上創建索引:

  • 要索引的列經常被查詢,並只返回表中的行的總數的一小部分。
  • 在索引的列或列集上存在引用完整性約束。索引可以避免當你更新父表主鍵、合併父表、從父表刪除行時可能引起的全表鎖定。
  • 要在表上設置唯一約束,並且需要手動指定索引和索引選項。

索引的特徵:
索引是一種模式對象,它在邏輯上和物理上都與其關聯的對象中的數據保持獨立。因此,可以刪除或創建索引而不會實際影響相關的表。

索引具有以下屬性:

  • 可用性
    索引可能是可用的或不可用的。不可用索引在DML操作中不會被維護,可提高大容量加載的性能。
  • 可見性

鍵和列:鍵是一個列集或表達式。

注意:主鍵和唯一鍵會自動生成索引,有時還需要在外鍵上創建索引。

複合索引

複合索引,也稱爲連接索引,是在表中的多個列上的索引。複合索引中的列應該以在檢索數據的查詢中最有意義的順序出現,但在表中不必是相鄰的。

唯一索引:

保證在表的鍵列或鍵列集上沒有具有重複的值得行。每個數據值都存在一個rowid,葉快中的數據根據鍵排序。
非唯一索引:允許在索引的列或列集中有重複的值,按索引鍵和rowid(升序)排序。

索引類型

  • B-樹索引
    標準索引類型,對於主鍵和高選擇性索引非常適合。在複合索引中使用時,B-樹索引可以按多個索引列以排序方式檢索數據。
    B-樹索引具有以下子類型:
    • 索引組織表:索引組織表不同於堆組織表,因爲數據本身就是索引。
    • 反鍵索引:在這種類型的索引中,索引鍵中的字節被反轉了,例如,123被存儲爲321。反轉字節可以把對索引記錄的插入分散到很多數據塊中。
    • 降序索引
    • B-樹簇索引:用於索引表簇鍵,它的鍵指向包含簇鍵相關所在塊,而不是指向行。
  • 位圖索引和位圖聯接索引
    在位圖索引中,索引提阿偶使用位圖來指向多個行。
  • 基於函數的索引
    這種類型的索引包括經過一個函數轉換過的列,或包括在表達式中的列。
  • 應用程序域索引
    這種類型的索引是由用戶爲一個特定的應用程序域中的數據創建的。其物理索引不需要使用傳統的索引結構,可以存儲爲Oracle數據庫表或外部文件。

索引組織表

索引組織表是存儲在B-樹索引結構的一種變體中的表。在堆組織表中,行被插入到適合他們的位置。在索引組織表中,行被存儲在表的主鍵索引中。

分區、視圖和其他模式對象

分區

分區使你能夠將非常大的表和索引分解成更小、更易於管理的叫做分區片段。每個分區是一個獨立的對象,具有其自己的名稱和存儲特徵。

分區特徵:每個表或索引的分區必須具有相同的邏輯屬性,如列名稱、數據類型、約束等。每個分區可以有單獨的物理屬性,如所屬的表空間。

分區策略:範圍分區、列表分區、哈希分區

分區表

分區表包含一個或多個分區,他們可以單獨進行管理,並且可以獨立於其他分區進行操作。表要麼是分區表要麼是非分區表。即使分區表只包含一個分區,也與未分區表不同。
分區表由一個或多個表分區段組成。如果創建一個名爲hash_products的分區表,但沒有爲詞表分配表段。相反,數據庫將每個表分區的數據存儲在自己的分區段中。每個表分區段包含表數據的一部分。堆組織表中的某些分區可以存儲爲壓縮格式。

視圖

視圖是一個或多個表的邏輯表示形式。視圖在本質上是一個存儲的查詢。視圖的數據來自它所依賴的稱爲基表的表。

序列
序列是一種模式對象,多個用戶可以用它來生成唯一整數。序列發生器提供高可擴展性和性能良好的方法,來位數字數據類型生成代理鍵。

例如:

CREATE SEQUENCE list_sales_seq
START WITH 1000           --從1000開始
INCREMENT BY 1            --步長爲1
NOCACHE
NOCYCLE;

維度與事實
一個典型的數據倉庫有兩個重要組成部分:維度和事實。維度是用於闡述業務問題的類別,如,時間、地理位置、等等。事實是與一組特定的維度的值相關的時間或實體,如銷量、利潤等。

數據完整性

完整性約束

Oracle數據庫能夠在表級或列級應用約束。作爲列或屬性定義的一部分而指定的約束,稱爲行內規範約束。作爲表定義的一部分而指定的約束稱爲行外規範約束。

  • 非空完整性約束
    not null約束要求表中的列不包含空值。
  • 唯一性約束
    唯一性約束要求在一個列或列集中的每個值的是唯一的。在一個表中,不允許多個行在有唯一約束的列(唯一鍵)或(複合唯一鍵)上具有重複值。

注意:鍵僅指在完整性約束中定義的列。因爲數據庫通過在鍵列上隱含創建或重用索引來強制執行唯一性約束,術語唯一鍵有事會被錯誤地用作唯一鍵約束或唯一索引的同義詞。

  • 主鍵約束
    每個表只能有一個主鍵,起到確定行的作用。

  • 外鍵約束
    只要兩個表包含一個或多個公共列,則數據庫可以通過一個外鍵約束來強制建立兩個表之間的關係。

數據字典和動態性能視圖

Oracle數據庫都具有制度參考表和視圖中最重要的部分,統稱爲數據字典

數據字典

  • 在數據庫中每個模式對象的定義,包括列的默認值和完整性約束信息
  • 分配給模式對象的空間量及當前已使用量
  • Oracle數據庫的名稱、授予用戶的權限和角色、與用戶相關的審計信息。
  • 訪問數據字典來查找有關用戶、模式對象、存儲結構的信息。
  • 每次發出DDL語句時,修改數據字典。

數據字典的內容

  • 基表
  • 視圖
前綴 用戶訪問 內容 注意
DBA_ 數據庫管理員 所有對象 一些 DBA_ 視圖具有更多的列,其中包含對管理員有用的信息。
ALL_ 所有用戶 用戶具有訪問權限的對象 包括用戶所擁有的對象。這些視圖服從當前已啓用的角色集合。
USER_ 所有用戶 用戶所擁有的對象 以 USER_爲前綴的視圖通常不包括OWNER 列。此列隱含爲對該 USER_ 視圖發出查詢的用戶。

動態性能視圖

在Oracle數據庫的操作過程中,會維護一組記錄當前數據庫轟動的虛擬表。這些視圖稱爲動態性視圖,因爲他們在數據庫處於打開狀態和在使用過程中會不斷更新。這些視圖有時也稱爲V$視圖,包含以下信息:

  • 系統和會話參數
  • 內存使用和分配
  • 文件狀態(包括RMAN備份文件)
  • 工作和任務的進度
  • SQL運行
  • 統計和度量

動態性能視圖用途

  • Oracle企業管理器使用這些視圖,來獲取有關數據庫的信息。
  • 管理員可以使用這些視圖,用於性能監控和調試。

數據庫對象的元數據

DBMS_METADATA軟件包提供了用於提取數據庫對象的完整定義的接口。定義可以按XML或SQL DDL來表示。

數據併發行和一致性

數據併發行,確保多個用戶可以同時訪問數據
數據一致性,確保每個用戶看到數據的一致的視圖,包括可以看到用戶自己的事務所做的更改,和其他用戶已提交的事務所做的更改。

Oracle數據庫通過使用多版本一致性模型和各種類型的鎖和事務,來維護數據的一致性。

多版本讀一致性

在Oracle數據庫中,多版本即同時實現數據的多個版本的能力。Oracle數據庫維護多版本讀取一致性,有以下特徵:

  • 讀一致查詢
    查詢所返回的數據已提交的,且關於某個單一時間點一致。

注意:Oracle不允許發生髒讀,當一個事務讀取了另一個事務中未提交的數據時,就會發生髒讀。

  • 非阻塞查詢
    數據讀取者和寫入者不會相互阻塞。

  • 語句級讀取一致性
    Oracle數據庫始終強制執行語句級讀取一致性,保證單個查詢所返回的數據是已提交的、且關於某個單一時間點一致。單個SQL語句所一致的時間點取決於事務的隔離界別和查詢的性質。

在讀提交隔離界別,該時間點是語句打開的時間。
在可串行化或只讀事務隔離級別,該時間點爲食物開始的時間。
在閃回查詢操作中,SELECT語句顯示指定時間點。

  • 事務級讀取一致性
    Oracle數據庫還可以爲一個事務中的所有查詢提供讀取一致性,這稱爲事務級讀取一致性。

讀取一致性及撤銷

ANSI/ISO事務隔離級別

Oracle數據庫事務隔離級別

已提交讀隔離級別

可串行化隔離級別

只讀隔離級別

數據庫鎖定機制

鎖是一種機制,用來防止多個共同訪問共享數據的事務之間的破壞性交互。
鎖分爲獨享鎖和共享鎖。在一個資源上,只能獲得一個獨佔鎖,但在單個資源上可以獲得很多共享鎖。
以下規則總結了Oracle數據庫中讀取者和寫入者的鎖定行爲:

  • 一行只有在被某個寫入者修改時,才被鎖定
  • 一行的寫入者,會阻塞在同一行上的併發寫入者
  • 一個讀取者永遠不會阻塞一個寫入者
  • 一個寫入者絕不會阻塞一個讀取者

獨佔鎖模式

此模式可防止先關資源被共享。當一個事務修改數據時,獲取一個獨佔鎖。直到獨佔鎖被釋放之前,第一個以獨佔方式鎖定資源的事務是唯一可以更改資源的事務。

共享鎖模式

取決於所涉及的操作,此模式允許相關資源被共享。讀取數據的多個用戶可以共享數據,並持有共享鎖,以防止企圖獲取獨佔鎖的寫入者併發訪問。多個事務可以同時獲取在同一資源上的共享鎖。

鎖轉換和鎖升級

數據庫在必要時執行鎖轉換。在鎖轉換中,數據庫自動將較低限制的表鎖轉換爲較高限制的其它鎖定。

發佈了46 篇原創文章 · 獲贊 48 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章