通過在Oracle子表外來鍵上建立索引提高效能
根據我的經驗,導致死鎖的頭號原因是外來鍵未加索引(第二號原因是表上的點陣圖索引遭到併發更新)。在以下兩種情況下,Oracle在修改父表後會對子表加一個全表鎖:
?1)如果更新了父表的主鍵(倘若遵循關聯式資料庫的原則,即主鍵應當是不可變的,這種情況就很少見),由於外來鍵上沒有索引,所以子表會被鎖住。
?2) 如果刪除了父表中的一行,整個子表也會被鎖住(由於外來鍵上沒有索引)。
除了全表鎖外,在以下情況下,未加索引的外來鍵也可能帶來問題:
1)? 如果有ON DELETE CASCADE,而且沒有對子表加索引:例如,EMP是DEPT的子表,DELETE DEPTNO = 10應該CASCADE(級聯)至EMP。如果EMP中的DEPTNO沒有索引,那麼刪除DEPT表中的每一行時都會對EMP做一個全表掃描。這個全表掃描可能是不必要的,而且如果從父表刪除多行,父表中每刪除一行就要掃描一次子表。
2)? 從父表查詢子表:再次考慮EMP/DEPT例子。利用DEPTNO查詢EMP表是相當常見的。如果頻繁地執行以下查詢(例如,生成一個報告),你會發現沒有索引會使查詢速度變慢:
? select * from dept, emp
? where emp.deptno = dept.deptno and dept.deptno = :X;
那麼,什麼時候不需要對外來鍵加索引呢?答案是,一般來說,當滿足以下條件時不需要加索引:
1)? 沒有從父表刪除行。
2)? 沒有更新父表的惟一鍵/主鍵值(當心工具有時會無意地更新主鍵!)。
3)? 沒有從父表聯結子表(如DEPT聯結到EMP)。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24104518/viewspace-716784/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 建立索引——提高SQL Server效能索引SQLServer
- 無索引的外來鍵之主表子表DML操作實驗及結論索引
- Oracle 外來鍵索引影響阻塞問題Oracle索引
- 通過外來鍵連線多個表
- oracle查詢表資訊(索引,外來鍵,列等)Oracle索引
- oracle檢視當前使用者下所有外來鍵、主鍵、索引、sequence的建立語句Oracle索引
- 10.30 索引,外來鍵索引
- 在已存在的表結構上新增主鍵、外來鍵、聯合主鍵、聯合索引的例子索引
- oracle外來鍵索引解決父表鎖定問題Oracle索引
- mysql建立外來鍵語句MySql
- 分析user_constraints為何不顯示子表外來鍵列構建的索引歷險記AI索引
- 查詢外來鍵約束、子表欄位等資訊的SQLSQL
- oracle foreign key外來鍵_更新主表對於子表三種行為控制Oracle行為控制
- Oracle '批量'禁用外來鍵的儲存過程Oracle儲存過程
- 外來鍵缺索引檢查指令碼索引指令碼
- 查詢沒有索引的外來鍵索引
- 基於v$lock.lmode分析父子表外來鍵列是否索引持鎖模式區別之系列六索引模式
- 表外來鍵未加索引之處理索引
- ORACLE角色(通過DBA建立)Oracle
- ORACLE: 查詢(看)表的主鍵、外來鍵、唯一性約束和索引Oracle索引
- Oracle 外來鍵查詢sqlOracleSQL
- 通過例項來理解MySQL索引薦MySql索引
- 檢查外來鍵是否有索引的指令碼索引指令碼
- Oracle根據主鍵查詢外來鍵Oracle
- 如何通過gzip和nginx來提高網站開啟速度及整體效能Nginx網站
- 通過Go來分析和建立XMLGoXML
- 【Analytic】使用分析函式ROW_NUMBER輔助完成外來鍵的索引批量建立函式索引
- enq: TM - contention解決之道——外來鍵無索引導致鎖爭用(上)ENQ索引
- 外來鍵沒有索引哪些DML操作會被阻塞索引
- 【fk_index】外來鍵中有無索引的區別Index索引
- SQL SERVER中找出拙劣的約束,索引,外來鍵SQLServer索引
- 千萬級MySQL資料庫建立索引,提高效能的祕訣MySql資料庫索引
- 通過oracle dbms_job建立tableOracle
- MySQL通過通用列索引來提供一個JSON列索引MySql索引JSON
- 在Azure上通過Powershell建立多Interface的Cisco CSR路由器路由器
- 通過Go來分析和建立JSONGoJSON
- SQL外來鍵約束的含義及建立SQL
- oracle外來鍵約束的總結Oracle