Oracle事務和常用數據對象
一、事務
1、簡介
事務是數據處理的核心,是業務上的一個邏輯單元,它能夠保證其中對數據所有的操作,要麽全部成功,要麽全部失敗。DBMS通過事務的管理來協調用戶的並發行為,減少用戶訪問資源的沖突。
1)顯示提交:當事務遇到COMMIT指令時,將結束事務並永久保存所有的更改的數據。
2)顯示回滾:當事務遇到ROLLBACK指令時,也將結束事務的執行,但是此時它回滾所有更改的數據到事務開始時的原始值,即取消更改,數據沒有變化。
3)DDL語句:一旦用戶執行了DDL(數據定義語言,如create,drop等)語句,則之前的所有DML(數據操作語言)操作作為一個事務提交,這種提交稱為隱示提交。
5)非正常地結束程序:當程序崩潰或意外終止時,所有數據更改都被回滾,這種回滾成為隱示回滾。
2、事務的特點
事務有4個特性,簡寫為ACID特性。
1)原則性:以轉賬操作為例,轉出賬戶余額減少和轉入余額增加是兩個DML語句,但是必須作為一個不可分割的完整操作。要麽同時成功,要麽同時失敗,只轉出而沒有轉入顯然是不可接受的。
2)一致性:無論是在事務前、事務中、事務後,數據庫始終處於一致的狀態。例如:轉賬前分別是2000和1000,總金額是3000,轉賬300後分別是1700和1300,總金額還是3000.這就叫做一致性。不一致就是在某個時間點查詢到的總金額不是3000.
4)持久性:如果事物提交成功,則數據修改永遠生效,如果是回滾,則數據完全沒有沒修改,就相當於沒有這件事情發生。
3、學會事物的控制
1)使用COMMIT和ROLLBACK實現事物控制
COMMIT:提交事物,把事物中對數據庫的修改進行永久保存。
ROLLBACK:回滾事物,取消對數據庫所做的任何修改。
4)驗證持久性
一旦使用commit命令來結束某個事務,那麽就必須保證數據庫不丟失這個事務。在事務進行期間,隔離性的原則要求除了指定會話涉及的用戶之外的任何用戶都不能查看當前所做的變化。不過事務一旦完成,所有用戶都必須能夠立即看到所做的變化,同時數據庫必須保證這些變化絕不會丟失。Oracle通過使用日誌文件來滿足這個需求。日誌文件具有兩種形式:聯機重做日誌文件,歸檔重做日誌文件。
關於事物的總結:
- 需要註意的是,Commit:只是用來確認這個數據已經正式的修改了,不一定非得寫入硬盤,DBWn什麽都不做。執行commit命令時發生的所有物理操作時LGWR進程將日誌緩沖區的內容寫入磁盤。DBWN進程完全沒有執行任何操作。DBWN進程與提交事物處理沒有關系,不過最終DBWN進程會將變化的數據塊寫入磁盤。
- commit和rollback語句只應於DML語句,我們無法回滾DDL語句。DDL語句一旦被執行就會立即具有持久狀態。
3.自動提交和隱式提交:oracle在某些情況下可以進行自動提交:執行DDL語句是一種情況,退出某個用戶進程也是一種自動提交。
二、索引
1、索引的含義
Oracle 數據庫對象又稱模式對象,數據庫對象是邏輯結構的集合,最基本的數據庫對象是表,索引也是其中之一。其他數據庫對象包括:
索引是oracle的一個對象,是與表關聯的可選結構,提供了一種快速訪問數據的途徑,提高了數據庫檢索性能。索引使數據庫程序無需對整個表進行掃描,就可以在其中找到所需要的數據。就像書的目錄,可以通過目錄快速查找所需信息,無需閱讀整本書。
2、索引的特點
適當地使用索引可以提高查詢速度
可以對表的一列或多列建立索引
建立索引的數量沒有限制
索引需要磁盤存儲,可以指定表空間,由oracle自動維護
索引對用戶透明,檢索時是否使用索引由oracle自身決定
Oracle數據庫管理系統在訪問數據時使用以下三種方式:
?全表掃描
?通過ROWID(行地址,快速訪問表的一行)
?使用索引
當沒有索引或者不選擇使用索引時就用全表掃描的方式
3、索引的分類
1)B樹索引結構
索引的頂部為根,其中包含指向下一級索引的項。下一級為分支塊,分支塊又指向索引中下一級的塊,最低一級的塊稱為葉節點,其中包含指向表數據行的索引項。葉節點為雙向連接,有助於按關鍵字值得升序和降序掃描索引。
例如:查詢id從2到31行的數據
上圖中使用索引遍歷過程如下:
先找到id<=50的分支塊,再找到30-40的分支塊,在找到id=31對應的索引項,之後通過葉節點雙向鏈接,平行地找到包含id=2的索引塊,完成對id的查詢
4、創建索引的語法
create [unique] index 索引名稱 on 表名(列名)[tablespace 表空間名稱]
解釋:
[unique]用於指定唯一索引,默認情況下為非唯一索引
[tablespace]為索引指定表空間
1)創建標準索引
SQL> CREATE INDEX index_name ON tablename(columnname)
TABLESPACE index_tbs;
2)重建索引
SQL> ALTER INDEX index_name REBUILD;
合並索引碎片
SQL>ALTER INDEX index_name COALESCE;
3)刪除索引
SQL> DROP INDEX index_name;
三、視圖
1、概述
視圖是一個虛表,不占用物理空間,因為視圖本身的定義語句存儲在數據字典裏,視圖中的數據是一個或多個實際表中獲得的。那些用於產生視圖的表叫做該視圖的基表。一個視圖也可以從另一個視圖中產生。
2、視圖的優點:
1)提供了另外一種級別的表安全性
2)隱藏的數據的復雜性:一個視圖可能是用多表連接定義的,但用戶不需要知道多表連接的語句也可以查詢數據。
3)簡化的用戶的SQL命令:查詢視圖的時候不需要寫出復雜的查詢語句,只需要查詢視圖名稱即可。
4)隔離基表結構的改變:視圖創建好了之後,如果修改了表的結構,也不會影響視圖的。
5)通過重命名列,從另一個角度提供數據:例如在銷售系統中,每日下班前要對當日數據進行匯總,在銷售人員眼中,該匯總表成為日銷售統計表,在財務人眼中,該銷售表成為銷售日報表。
3、創建視圖的語法:
1) CREATE [OR REPLACE] [FORCE] VIEW
view_name [(alias[, alias]...)]
AS select_statement
[WITH CHECK OPTION]
[WITH READ ONLY];
解釋:
OR REPLACE:如果視圖已存在,此選項將重新創建該視圖。
FORCE:如果使用此關鍵字,則無論基表是否存在,都將創建視圖。
NOFORCE:這是默認值,如果使用此關鍵字,則僅當基表存在時才創建視圖。
VIEW_NAME:要創建視圖的名稱
Alias:指定由視圖的查詢所選擇的表達式或列的別名。別名的數目必須與視圖所選擇的表達式的數目相匹配。
Select_statement:select語句
WITH CHECK OPTION :此選項指定只能插入或更新視圖可以訪問的行。術語constraint表示為CHECK OPTION約束指定的名稱。
WITH READ ONLY:此選項保證不能在此視圖上執行任何修改操作。
2)視圖中的ORDER BY子句
可以在創建視圖時在SELECT語句中使用ORDER BY子句,以便按照特定的順序進行排序,這樣,在查詢視圖時即使不使用ORDER BY子句,結果集也會按指定的順序進行排列。
3)創建帶有錯誤的視圖
如果在create view語句中使用FORCE選項,即使存在系列情況,oracle也會創建視圖。
?視圖定義的查詢引用了一個不存在的表。
?視圖定義的查詢引用了現有表中無效的列。
?視圖的所有者沒有所需的權限。
在這些情況下,oracle僅檢查create view語句中的語法錯誤。如果語法正確,將會創建視圖,並將視圖的定義存在數據字典中。但是,該視圖卻不能使用。這種視圖被認為是“帶錯誤創建”的。可使用SHOW ERRORS VIEW視圖名來查看錯誤。
四、序列
序列是用來生成唯一、連續的整數數據庫對象。序列通常用來自動生成主鍵或唯一鍵的值。序列可以按升序排列,也可以按降序排列,與excel的自動排序,以及sqlserver的標識符是一樣的。
五、同義詞
同義詞是對象的一個別名,不占用任何的實際存儲空間,只在oracle的數據字典中保存其定義描述,在使用同義詞時,oracle會將其翻譯為對應對象的名稱。
1、同義詞的用途
1)簡化sql語句
如果用戶創建的表的名字很長,可以為這個表創建一個oracle同義詞來簡化語句。
2)隱藏對象的名稱和所有者
多用戶協同開發中,可以屏蔽對象的名稱及持有者。如果沒有同義詞,當操作其他用戶的表時,必須通過“用戶名.表名”的形式操作,采用了oracle同義詞之後就可以隱藏掉用戶名。例如:用戶user1要訪問用戶的SCOTT的EMP表,必須使用SCOTT.emp來引用。如果為用戶創建一個名為emp的同義詞代表SCOTT.emp,那麽user1就可以用該同義詞像訪問自己的表一樣引用SCOTT.emp了。
3)為分布式數據庫的遠程對象提供位置透明性
要完成遠程對象的訪問,先要了解數據庫連接的概念。數據庫鏈接是一個命名的對象,說明一個數據庫到另一個數據庫的路徑,通過其可以實現不同的數據庫之間的通信。同義詞在數據庫鏈接中的作用就是提供位置透明性。
4)提供對數據庫對象的公共訪問
公有同義詞只是為數據庫對象定義了一個公共的別名,即其他用戶都可以通過這個別名訪問,但能夠通過該別名訪問成功,還要看是否已經具有數據庫對象的訪問權限。
2、同義詞的分類
?同義詞分為以下兩類:私有同義詞和公有同義詞
?私有同義詞只能在其模式內訪問,且不能與當前模式的對象同名
?公有同義詞可被所有的數據庫用戶訪問
2-1:私有同義詞
私有同義詞只能被當前模式的用戶訪問,私有同義詞名稱不可與當前模式的對象名稱相同。要在自身的模式創建私有同義詞,用戶必須擁有create synonym系統權限。要在其他用戶模式創建私有同義詞,用戶必須擁有create any synonym系統權限。
2)創建私有同義詞的語法如下:
CREATE OR REPLACE SYNONYM [schema.]synonym_name FOR [schema.]object_name;
synonym_name:要創建同義詞的名稱
object_name:指定要為之創建同義詞的對象的名稱。
六、分區表
1、分區表的含義
Oracle允許把一個表重的所有行分成幾個部分,並將它們存儲在不通的表空間,分成的每一部分成為一個分區,被分區的表成為分區表。
對於包含大量數據的表來說,分區很有用,優點有以下幾點:
1)改善表的查詢性能。在對表進行分區後,用戶執行sql查詢時可以只訪問表中的特定分區而非整個表。
2)表更容易管理。因為分區表的數據存儲在多個部分中,按分區加載和刪除數據比在表中加載和刪除更容易。
3)便於備份和恢復。可以獨立地備份和恢復每個分區。
4)提高數據安全性。將不同的分區分布在不同的磁盤,可以減少所有分區的數據同時損壞的可能性。
復合一下條件的表可以建成分區表:
1)數據量大於2GB。
2)已有的數據和新添加的數據有明顯的界限劃分。
表分區對用戶是透明的,及應用程序可以不知道表已被分區,在更新和查詢分區表時當做普通表來操作,但oracle優化程序知道表已被分區。
註意:要分區的表不能具有LONG和LONG RAW數據類型的列。
2、分區表的分類
Oracle提供的分區方法有範圍分區、列表分區、散列分區、復合分區、間隔分區和虛擬列分區等。其中間隔分區和虛擬列分區是oracle11g的新特性
Oracle事務和常用數據對象