說我有兩個表:甲骨文刪除性能
create table parent (
id number not null,
constraint parent_pk primary key(id),
)
create table child (
id number not null,
parent_id number not null,
constraint child_pk primary key(id),
constraint child_fk1 foreign key(parent_id)
references parent(id)
)
父表是很大的,比如說,300萬的記錄。現在我運行刪除語句:
delete from parent; //even without where clause
請您解釋執行此語句時實際發生了什麼?哪裏沒有指定「ON DELETE CASCADE」選項,據我所知,這意味着如果子表包含對父ID的引用,則從父表中刪除應該失敗。所以這意味着在從父表中刪除行之前,Oracle應該檢查是否存在任何子記錄。但這真的非常慢 - 它是逐行刪除。
我正確嗎?如果沒有,請解釋從父表中刪除時Oracle是如何工作的,並檢查子表中是否還有孤兒?
我認爲你是對的。這是一個逐行檢查。 ON DELETE CASCADE不應該失敗,但是也應該刪除子行。 – Thilo
這是否意味着ON DELETE CASCADE的性能與沒有此選項時大致相同? (考慮到沒有引用子表的表) – andrershov
當你說「但是這真的非常慢 - 它是逐行刪除。「你的意思是你已經運行了一個測試用例,它真的很慢*?或者你只是想象得到這樣的結果嗎? – APC