當前位置:
首頁 > 最新 > Oracle資料庫——Oracle事務和常用數據對象優化

Oracle資料庫——Oracle事務和常用數據對象優化

本次內容的相關知識點我們在學習sqlserver2008R2的時候介紹過一些,包括:事務、索引、視圖等。那麼今天我們學習在oracle上實現這些重要的內容,以實現資料庫的優化。


一、事務

事務是數據處理的核心,是業務上的一個邏輯單元,它能夠保證其中對數據所有的操作,要麼全部成功,要麼全部失敗。DBMS通過事務的管理來協調用戶的並發行為,減少用戶訪問資源的衝突。

1)顯示提交:當事務遇到COMMIT指令時,將結束事務並永久保存所有的更改的數據。

2)顯示回滾:當事務遇到ROLLBACK指令時,也將結束事務的執行,但是此時它回滾所有更改的數據到事務開始時的原始值,即取消更改,數據沒有變化。

3)DDL語句:一旦用戶執行了DDL(數據定義語言,如create,drop等)語句,則之前的所有DML(數據操作語言)操作作為一個事務提交,這種提交稱為隱示提交。

4)正常結束程序:如果oracle資料庫應用程序正常結束,如使用sqlplus工具更改了數據,而正常退出該程序(exit),則oracle自動提交事務。

5)非正常地結束程序:當程序崩潰或意外終止時,所有數據更改都被回滾,這種回滾成為隱示回滾。


事務有4個特性,簡寫為ACID特性。

1)原則性:以轉賬操作為例,轉出賬戶餘額減少和轉入餘額增加是兩個DML語句,但是必須作為一個不可分割的完整操作。要麼同時成功,要麼同時失敗,只轉出而沒有轉入顯然是不可接受的。

2)一致性:無論是在事務前、事務中、事務後,資料庫始終處於一致的狀態。例如:轉賬前分別是2000和1000,總金額是3000,轉賬300後分別是1700和1300,總金額還是3000.這就叫做一致性。不一致就是在某個時間點查詢到的總金額不是3000。

3)隔離性:在某個時間段,肯定有很多人都在轉賬,每個人的轉賬都是在自己的事務中,所以在一個資料庫中,會有很多事物同時存在。雖然同時存在很多事物,但是事物之間不會相互影響。

4)持久性:如果事物提交成功,則數據修改永遠生效,如果是回滾,則數據完全沒有沒修改,就相當於沒有這件事情發生。


1)使用COMMIT和ROLLBACK實現事物控制

COMMIT:提交事物,把事物中對資料庫的修改進行永久保存。

ROLLBACK:回滾事物,取消對資料庫所做的任何修改。

2)使用AUTOCOMMIT實現事物的自動提交

Orade提供了一種自動提交DML操作的方式,這樣一旦用戶執行了DML操作,如UPDATE,DELETE等,數據就會自動提交。

例2:使用autocommit實現事物自動提交,設置autocommit為ON

3)驗證持久性

一旦使用commit命令來結束某個事務,那麼就必須保證資料庫不丟失這個事務。在事務進行期間,隔離性的原則要求除了指定會話涉及的用戶之外的任何用戶都不能查看當前所做的變化。不過事務一旦完成,所有用戶都必須能夠立即看到所做的變化,同時資料庫必須保證這些變化絕不會丟失。Oracle通過使用日誌文件來滿足這個需求。日誌文件具有兩種形式:聯機重做日誌文件,歸檔重做日誌文件。

一個正確配置的oracle資料庫是不可能丟失數據的。當然用戶的錯誤(包括不恰當的DML或刪除對象)也會造成數據的丟失。DDL語句有自動提交功能(create、drop、truncate、alter)


需要注意的是,Commit:只是用來確認這個數據已經正式的修改了,不一定非得寫入硬碟,DBWn什麼都不做。執行commit命令時發生的所有物理操作時LGWR進程將日誌緩衝區的內容寫入磁碟。DBWN進程完全沒有執行任何操作。DBWN進程與提交事物處理沒有關係,不過最終DBWN進程會將變化的數據塊寫入磁碟。 commit和rollback語句只應於DML語句,我們無法回滾DDL語句。DDL語句一旦被執行就會立即具有持久狀態。


二、索引

Oracle 資料庫對象又稱模式對象,資料庫對象是邏輯結構的集合,最基本的資料庫對象是表,索引也是其中之一。其他資料庫對象包括:

索引是oracle的一個對象,是與表關聯的可選結構,提供了一種快速訪問數據的途徑,提高了資料庫檢索性能。索引使資料庫程序無需對整個表進行掃描,就可以在其中找到所需要的數據。就像書的目錄,可以通過目錄快速查找所需信息,無需閱讀整本書。


適當地使用索引可以提高查詢速度

可以對錶的一列或多列建立索引

建立索引的數量沒有限制

索引需要磁碟存儲,可以指定表空間,由oracle自動維護

索引對用戶透明,檢索時是否使用索引由oracle自身決定

Oracle資料庫管理系統在訪問數據時使用以下三種方式:

全表掃描

通過ROWID(行地址,快速訪問表的一行)

使用索引

當沒有索引或者不選擇使用索引時就用全表掃描的方式


1)B樹索引結構

索引的頂部為根,其中包含指向下一級索引的項。下一級為分支塊,分支塊又指向索引中下一級的塊,最低一級的塊稱為葉節點,其中包含指向表數據行的索引項。葉節點為雙向連接,有助於按關鍵字值得升序和降序掃描索引。

例如:查詢id從2到31行的數據

上圖中使用索引遍歷過程如下:

先找到id


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)隱藏的數據的複雜性:一個視圖可能是用多表連接定義的,但用戶不需要知道多表連接的語句也可以查詢數據。

3)簡化的用戶的SQL命令:查詢視圖的時候不需要寫出複雜的查詢語句,只需要查詢視圖名稱即可。

4)隔離基表結構的改變:視圖創建好了之後,如果修改了表的結構,也不會影響視圖的。

5)通過重命名列,從另一個角度提供數據:例如在銷售系統中,每日下班前要對當日數據進行匯總,在銷售人員眼中,該匯總表成為日銷售統計表,在財務人眼中,該銷售表成為銷售日報表。


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:此選項保證不能在此視圖上執行任何修改操作。


可以在創建視圖時在SELECT語句中使用ORDER BY子句,以便按照特定的順序進行排序,這樣,在查詢視圖時即使不使用ORDER BY子句,結果集也會按指定的順序進行排列。


如果在create view語句中使用FORCE選項,即使存在系列情況,oracle也會創建視圖。

視圖定義的查詢引用了一個不存在的表。

視圖定義的查詢引用了現有表中無效的列。

視圖的所有者沒有所需的許可權。

在這些情況下,oracle僅檢查create view語句中的語法錯誤。如果語法正確,將會創建視圖,並將視圖的定義存在數據字典中。但是,該視圖卻不能使用。這種視圖被認為是「帶錯誤創建」的。可使用SHOW ERRORS VIEW視圖名來查看錯誤。

關注深秀Deepshow,我們會持續為您推送編程界乾貨。每天兩篇不停歇。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 深秀Deepshow 的精彩文章:

TAG:深秀Deepshow |