(基礎知識)Oracle中外鍵不加索引?

Oracle中外鍵不加索引可能會導致3個問題,這裏的外鍵包括Oracle所有種類的外鍵(普通外鍵、級聯外鍵和置空外鍵)1

1. 死鎖以及併發問題。

對於父表的delete、update操作都會導致子表鎖定(表級鎖)。這指的是發起指令到指令結束這一段過程中,會鎖表。這個全表鎖可能會導致死鎖2,以及帶來的子表併發性的問題:

A鎖定了子表,等待訪問B鎖定的資源釋放。此時,B繼續對父表進行delete、update,會鎖定子表,等待A釋放子表。從而造成死鎖。

這裏強調一下,對於父表的delete、update操作,發起指令到指令結束這一段過程中,會鎖表。也就是說若delete from 父表 where x = 1; 那麼子表在會話顯示出 xxx row deleted.結果之前是鎖定的,顯示出之後又是釋放的。這個很關鍵,有助於理解一些例子。

2. 刪除變慢。

若索引是ON DELETE CASCADE,也就是級聯外鍵。即使在不會導致1的情況,也會在刪除過程中,每刪除父表的一行就會對子表進行一次全表掃描,造成刪除變慢2

3. 查詢變慢。

父表查詢子表通過外鍵聯合查詢下,沒有添加外鍵索引會導致查詢變慢。

參考資料

[1] Oracle編程藝術深入理解數據庫體系結構(第3版),p460
[2] Oracle編程藝術深入理解數據庫體系結構(第3版),p205
[3] http://blog.csdn.net/robinson1988/article/details/38421991

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