第四章索引和事務
1. 什么是索引?有什么用?
1)索引是資料庫物件之一,用于加快資料的檢索,類似于書籍的目錄,在資料庫中索引可以減少資料庫程式查詢結果時需要讀取的資料量,類似于在書籍中我們利用索引可以不用翻閱整本書即可找到想要的資訊,
2)索引是建立在表上的可選物件;索引的關鍵在于通過一組排序后的索引鍵來取代默認的全表掃描檢索方式,從而提高檢索效率
3)索引在邏輯上和物理上都與相關的表和資料無關,當創建或者洗掉一個索引時,不會影響基本的表;
4)索引一旦建立,在表上進行DML操作時(例如在執行插入、修改或者洗掉相關操作時),oracle會自動管理索引,索引洗掉,不會對表產生影響
5)索引對用戶是透明的,無論表上是否有索引,sql陳述句的用法不變
6)oracle創建主鍵時會自動在該列上創建索引
2. 索引的底層實作原理
當一列索引創建成功后,oracle系統會這個列復制一個份放入快取,并按照一定規則做排序和去重,從而減少檢索資料的范圍,但是索引不是創建的越多越好,因為一個索引的創建,就需要在快取中開辟一個空間,過多的索引反而會加重資料庫的檢索速度,
3. 索引的設計理念
1)某個欄位在條件查詢中會被高頻率的呼叫 where 條件
2)表關聯的連接欄位 on 條件
3)實際業務需求
4. 索引的分類
1) 唯一索引
主鍵會默認添加索引
適用:主鍵
2)BTREE索引(默認索引)
1.oracle中最常用的索引;B樹索引就是一顆二叉樹;葉子節點(雙向鏈表)包含索引列和指向表中每個匹配行的ROWID值
2.所有葉子節點具有相同的深度,因而不管查詢條件怎樣,查詢速度基本相同
3.能夠適應精確查詢、模糊查詢和比較查詢
適用:列基數(列不重復值的個數)大時適合使用B樹索引
3)位圖索引
創建位圖索引時,oracle會掃描整張表,并為索引列的每個取值建立一個位圖(位圖中,對表中每一行使用一位(bit,0或者1)來標識該行是否包含該位圖的索引列的取值,如果為1,表示對應的rowid所在的記錄包含該位圖索引列值),最后通過位圖索引中的映射函式完成位到行的ROWID的轉換
適用:對于基數小的列適合簡歷位圖索引(例如性別等)
4)單列索引和復合索引
如果索引建立在多個列上,只有它的第一個列被where子句參考時,優化器才會使用該索引,即至少要包含組合索引的第一列,即索引按照順序被呼叫
5. 索引操作
查看索引
select * from user_indexes where TABLE_NAME='EMPLOYEES';
創建BTREE索引
CREATE INDEX index_name on table_name(colum1,colum2…);
創建位圖索引
CREATE BITMAP INDEX index_name on table_name(colum1,colum2…);
修改索引
alter index index_name1 rename to index_name2;
洗掉索引
drop index index_sno;
索引在全域唯一
6. 圖形化操作
事務
事務是操作資料庫最小的單位,是1潭訓N條SQL陳述句組成的邏輯,
四大特性
1. 原子性A(Atomic)
事務是一個整體,不可分割,一起成功or一起失敗
2. 一致性C(Consistency)
事務執行前和執行后必須處于一致性狀態
3. 隔離性I(Isolation)
多事務并發時,相互獨立,互不影響
4. 持久性D(Durability)
資料庫資料若不變更,會永久不變
事務會造成的問題
1. 臟讀
臟讀是指在一個事務處理程序里讀取了另一個未提交的事務中的資料
2. 不可重復讀
不可重復讀是指在對于資料庫中的某個資料,一個事務范圍內多次查詢卻回傳了不同的資料值,這是由于在查詢間隔,被另一個事務修改并提交了,
3. 幻讀
在讀寫一批資料時,發現讀取到的資料不一致,就是發生了幻覺一樣
以上問題,都是發生在多事務并發時,資料前后不一致造成的
資料庫提供的四種隔離級別:
Read uncommitted(讀未提交):最低級別,任何情況都會發生,
Read Committed(讀已提交):可避免臟讀的發生,
Repeatable read(可重復讀):可避免臟讀、不可重復讀的發生,
Serializable(串行化):避免臟讀、不可重復讀,幻讀的發生,
MySQL默認級別是 可重復讀;
Oracle 僅支持讀已提交和串行化,默認級別是 讀已提交
鎖機制
1. 共享鎖/樂觀鎖(Share Locks,即S鎖)加了共享鎖的資料物件可以被其他事務讀取和修改
2. 排它鎖/悲觀鎖(Exclusive Locks,即X鎖):當資料物件被加上排它鎖時,其他的事務不能對它讀取和修改
死鎖
1. 兩張表T1,T2
2. A用戶已訪問T1表,并加鎖T1表,嘗試訪問T2表;訪問不到T2表,就不撤T1表的鎖
3. B用戶已訪問T2表,并加鎖T2表,嘗試訪問T1表;訪問不到T1表,就不撤T2表的鎖
4. 兩個用戶就發生了死鎖
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/14940.html
標籤:Oracle
上一篇:組函式和表關系
下一篇:plsql欄位約束
