您好,登錄后才能下訂單哦!
在 測試環境下,創建兩張表, PK1和FK1,通過外鍵PK_ID進行關聯,
檢查外鍵無索引和有索引情況下對數據庫的影響
如下所示,建立兩張表,主表為 PK1, 子表為 FK1 ,主表主鍵為 ID 列,子表主鍵也為 ID 列,外鍵約束為 PK_ID,references 為 PK1 的 ID 列。
主表鍵
子表鍵
主表列
子表列
主表和子表的數據
測試大類 |
測試內容 |
測試結果 |
外鍵無索引 |
a. 子表有刪改操作。 同時 主表有刪操作,或者更新主鍵的操作。 b. 刪除主表記錄或主子表關聯查詢 |
a. 子表有刪改操作。 同時 主表有刪操作,或者更新主鍵的操作。 滿足以上兩個條件會出現主表操作hang狀態。 b 外鍵不建索引,則刪除主表記錄或主子表關聯查詢,都會進行子表的全表掃描。 |
外鍵有索引 |
a. 子表有刪改操作。 同時 主表有刪操作,或者更新主鍵的操作。 b. 刪除主表記錄或主子表關聯查詢 |
未出現主表 hang和相關全表掃描 |
(1) 外鍵沒有索引,會導致子表產生表鎖:
a. 子表有刪改操作。
b. 主表有刪操作,或者更新主鍵的操作。
滿足以上兩個條件會出現主表操作hang 狀態。
(2) 外鍵不建索引,則刪除主表記錄或主子表關聯查詢,都會進行子表的全表掃描。
(3) 只有外鍵創建索引, (1) 中的操作才不會出現鎖或 hang 狀態, (2) 中的操作才有可能使用索引。
1. 更新子表時,主表無法刪除列或者更新主鍵列。
2. 刪除子表列時,主表無法刪除列或者更新主鍵列
同時進行關聯查詢時,會用到全表掃描
刪除主表數據的話,還會對子表進行全表掃描
SQL ID: 6j3nfuym9sr2q Plan Hash: 715003257
delete from pk1
where
id=8
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 1 7 1
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 2 0.00 0.00 0 1 7 1
Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 90
Number of plan statistics captured: 1
Rows (1st) Rows (avg) Rows (max) Row Source Operation
---------- ---------- ---------- ---------------------------------------------------
0 0 0 DELETE PK1 (cr=8 pr=0 pw=0 time=2968 us)
1 1 1 INDEX UNIQUE SCAN PK_ID (cr=1 pr=0 pw=0 time=47 us cost=0 size=13 card=1)(object id 76853)
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
SQL*Net message to client 1 0.00 0.00
SQL*Net message from client 1 4.08 4.08
*******************************************************************************
SQL ID: 6j3sg0cgf9vvf Plan Hash: 92442012
select /*+ all_rows */ count(1)
from
"TEST"."FK1" where "PK_ID" = :1
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 1 0.00 0.00 0 7 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 3 0.00 0.00 0 7 0 1
Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: SYS (recursive depth: 1)
Number of plan statistics captured: 1
Rows (1st) Rows (avg) Rows (max) Row Source Operation
---------- ---------- ---------- ---------------------------------------------------
1 1 1 SORT AGGREGATE (cr=7 pr=0 pw=0 time=604 us)
0 0 0 TABLE ACCESS FULL FK1 (cr=7 pr=0 pw=0 time=523 us cost=3 size=13 card=1)
******************************************************************************* *
子表建立索引后
對子表的刪除或者更新操作后,主表更新主鍵或者刪除列不會獲取表鎖,可以正常執行。
同時關聯查詢時也會用到索引
對主表的刪除也不會進行全表掃描
SQL ID: 6j3nfuym9sr2q Plan Hash: 715003257
delete from pk1
where
id=8
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 1 6 1
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 2 0.00 0.00 0 1 6 1
Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 90
Number of plan statistics captured: 1
Rows (1st) Rows (avg) Rows (max) Row Source Operation
---------- ---------- ---------- ---------------------------------------------------
0 0 0 DELETE PK1 (cr=1 pr=0 pw=0 time=874 us)
1 1 1 INDEX UNIQUE SCAN PK_ID (cr=1 pr=0 pw=0 time=47 us cost=0 size=13 card=1)(object id 76853)
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
SQL*Net message to client 1 0.00 0.00
SQL*Net message from client 1 9.67 9.67
********************************************************************************
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。